Python pandas计算列内行间时间间隔跨天结果为负如何解决
单列时间数据相邻行跨天时间间隔计算异常解决方案
问题场景
需要计算单列时间数据中相邻行的时间间隔,单位为分钟。
输入数据
New Time 11:59:57 12:42:10 12:48:45 18:44:53 18:49:06 21:49:54 21:54:48 5:28:20
原有实现代码
import pandas as pd import numpy as np df = pd.read_csv(r"D:\test\test1.csv") df['Interval in min'] = (pd.to_timedelta(df['New Time'].astype(str)).diff(1).dt.floor('T').dt.total_seconds().div(60)) print(df)
异常运行输出
New Time Interval in min 11:59:57 NaN 12:42:10 42.0 12:48:45 6.0 18:44:53 356.0 18:49:06 4.0 21:49:54 180.0 21:54:48 4.0 5:28:20 -987.0
问题原因
pd.to_timedelta解析纯时分秒格式数据时,默认所有时间归属同一天,当后一行时间早于前一行时间(即跨天场景,如前一行是当日21:54:48,后一行是次日5:28:20),直接做差会得到负数结果,原生逻辑无法自动识别跨天规则。
修复方案
核心逻辑:默认时序数据按时间先后顺序排列,相邻行时间差不超过24小时。当计算得到的相邻时间差为负数时,给差值加上1天对应的1440分钟,即可修正跨天场景的计算误差,非跨天场景的原有正确结果不受影响。
修复后代码
import pandas as pd import numpy as np df = pd.read_csv(r"D:\test\test1.csv") # 先清洗时间字符串前后的冗余空格,避免解析异常 time_delta = pd.to_timedelta(df['New Time'].astype(str).str.strip()) # 按原有逻辑计算原始时间差,向下取整到分钟 raw_diff = time_delta.diff(1).dt.floor('T').dt.total_seconds() / 60 # 负数差值补1天的分钟数,修正跨天计算错误 df['Interval in min'] = np.where( raw_diff.isna(), np.nan, np.where(raw_diff < 0, raw_diff + 1440, raw_diff) ) print(df)
修复后正确输出
New Time Interval in min 0 11:59:57 NaN 1 12:42:10 42.0 2 12:48:45 6.0 3 18:44:53 356.0 4 18:49:06 4.0 5 21:49:54 180.0 6 21:54:48 4.0 7 5:28:20 453.0
适配说明:该方案适用于按时间先后顺序排列、相邻记录间隔不超过24小时的日志、流水类时间数据场景,若存在间隔超过24小时的业务场景,需要结合日期字段共同解析后再计算差值。
内容的提问来源于stack exchange,提问作者ankur .k
相关产品推荐
相关产品推荐

