使用total_second计算跨日期Elapsed_time出现负值的解决需求
解决跨日期时Elapsed_time负值问题
问题说明
计算CSV数据的经过时间(Elapsed_time)时,跨日期后Elapsed_time出现负值,需要实现跨日期后持续递增的经过时间。
现有代码
import numpy as np import datetime as dt import matplotlib.pyplot as plt import pylab as pl import pandas as pd dft = pd.read_csv("/content/drive/MyDrive/toa_data/to_csv_out_columns.csv", encoding="UTF-8") dft["Time"] = pd.to_datetime(dft["Time"]) dft["second"] = pd.to_timedelta(dft["Time"].dt.time.astype(str)).dt.total_seconds()#.div(60) dft = dft.set_index("second") #dft.index = pd.to_datetime(dft.index) dft['diff'] = dft.index.to_series().diff() dft["Elapsed_time"]=dft["diff"].cumsum() dft.head(5)
现有输出
second Time Elapsed_time value diff 72446 2023-04-22 20:07:26 3.16 72506 2023-04-22 20:08:26 60 3.16 60 72566 2023-04-22 20:09:26 120 3.17 60 72626 2023-04-22 20:10:26 180 3.18 60 --------------omission----------------------------------- 86306 2023-04-22 23:58:26 13860 3.41 60 86366 2023-04-22 23:59:26 13920 3.41 60 26 2023-04-23 0:00:26 -72420 3.41 -86340 86 2023-04-23 0:01:26 -72360 3.41 60 146 2023-04-23 0:02:26 -72300 3.41 60 --------------------------------------------------
期望输出
second Time Elapsed_time value diff 72446 2023-04-22 20:07:26 3.16 72506 2023-04-22 20:08:26 60 3.16 60 72566 2023-04-22 20:09:26 120 3.17 60 72626 2023-04-22 20:10:26 180 3.18 60 --------------omission---------------------------- 86306 2023-04-22 23:58:26 13860 3.41 60 86366 2023-04-22 23:59:26 13920 3.41 60 86426 2023-04-23 0:00:26 13960 3.41 60 86486 2023-04-23 0:01:26 14020 3.41 60 86546 2023-04-23 0:02:26 14080 3.41 60 --------------------------------------------------
解决方案
原代码问题在于仅提取了当天的秒数作为索引,跨日期后秒数重置为0开始,导致相邻时间的差值出现负数,累计后Elapsed_time变为负值。
正确做法是基于完整的datetime时间戳计算时间差,而非单独提取当天秒数。直接用每条数据的时间与第一条数据的时间做差,转成总秒数即可得到持续递增的Elapsed_time;相邻时间的差值也直接用datetime列计算。
修改后代码
import pandas as pd # 读取数据并转换时间列 dft = pd.read_csv("/content/drive/MyDrive/toa_data/to_csv_out_columns.csv", encoding="UTF-8") dft["Time"] = pd.to_datetime(dft["Time"]) # 计算从第一条记录开始的经过时间(秒) dft["Elapsed_time"] = (dft["Time"] - dft["Time"].iloc[0]).dt.total_seconds() # 计算相邻记录的时间间隔(秒) dft['diff'] = dft["Time"].diff().dt.total_seconds() # 保留原有的当天秒数列(可选,若不需要可删除) dft["second"] = (dft["Time"] - dft["Time"].dt.normalize()).dt.total_seconds() # 查看结果 dft.head(5)
验证结果
修改后跨日期的Elapsed_time会持续递增,diff也会正确显示相邻时间的间隔(如跨日期的60秒),符合期望输出:
second Time Elapsed_time value diff 72446 2023-04-22 20:07:26 3.16 72506 2023-04-22 20:08:26 60 3.16 60 72566 2023-04-22 20:09:26 120 3.17 60 72626 2023-04-22 20:10:26 180 3.18 60 --------------omission---------------------------- 86306 2023-04-22 23:58:26 13860 3.41 60 86366 2023-04-22 23:59:26 13920 3.41 60 86426 2023-04-23 0:00:26 13960 3.41 60 86486 2023-04-23 0:01:26 14020 3.41 60 86546 2023-04-23 0:02:26 14080 3.41 60 --------------------------------------------------
内容的提问来源于stack exchange,提问作者izumi
相关产品推荐
相关产品推荐

