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

如何计算pandas DataFrame中两个时间戳列的小时差值

问题原因
  • 你调用str(df3['End time'])是把整个Series对象转为打印用的文本字符串,不是对每个单元格的值做字符串转换,pandas无法识别这种包含行号、省略号的整体字符串格式,这是触发ValueError的核心原因
  • 你的End time列存在非法值(比如示例中的-1),不符合时间格式,直接解析会报错
  • 注意列名大小写匹配:你提供的表头是Start time,你代码里写的是Start Time,大小写不一致会触发KeyError,要先对齐列名
修复后代码
import pandas as pd

# 对两列分别做时间转换,指定格式,非法值转为空时间NaT
df3['Start_time_dt'] = pd.to_datetime(df3['Start time'], format='%H:%M:%S', errors='coerce')
df3['End_time_dt'] = pd.to_datetime(df3['End time'], format='%H:%M:%S', errors='coerce')

# 计算时间差,转为小时单位,需要保留两位小数可以加round(2)
df3['timespent(hour)'] = (df3['End_time_dt'] - df3['Start_time_dt']).dt.total_seconds() / 3600

# 可选:删除中间生成的临时转换列
df3 = df3.drop(columns=['Start_time_dt', 'End_time_dt'])
补充说明
  • 如果你的时间格式确实带微秒(%H:%M:%S.%f),把上面format参数改成'%H:%M:%S.%f'即可
  • errors='coerce'会把所有不符合格式的值(比如示例里的-1)转成空值NaT,对应的时间差结果就是NaN,你可以后续根据需求过滤或者填充这些空值
  • 如果存在跨天的情况(比如23点到次日1点),计算出来的结果会是负数,可加以下逻辑修正:
df3['timespent(hour)'] = df3['timespent(hour)'].apply(lambda x: x + 24 if x < 0 else x)

内容的提问来源于stack exchange,提问作者Manoj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:03