You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:33:39