如何计算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
相关产品推荐
相关产品推荐

