Pandas中dt.time()类型转换为timedelta类型报错如何解决
问题根因
- 核心错误出在最后一行转换代码:你写的
pd.to_timedelta(['Time'])传入的是仅包含字面字符串'Time'的Python列表,没有引用DataFrame中的实际Time列,pandas尝试将字符串"Time"本身转换为时间差类型,必然触发类型转换错误。 - 即使修正列引用,直接对
dt.time生成的原生datetime.time对象调用pd.to_timedelta也存在兼容问题:原生time对象绑定日期锚点,无法直接映射为无日期的纯时间差格式。
修复方案
不需要先拆分出dt.time类型再做二次转换,直接从原始时间列计算得到timedelta类型的时间值是最稳定高效的写法,修正后完整代码如下:
# 提取日期列 df['Dates'] = pd.to_datetime(df['Date/Time (earliest)']).dt.date # 用原始时间减去当日0点时间,得到的差值就是纯时间长度的timedelta类型 df['Time'] = pd.to_datetime(df['Date/Time (earliest)']) - pd.to_datetime(df['Dates'])
效果说明
- 转换完成后执行
print(df['Time'].dtype),会输出timedelta64[ns],为pandas标准时间差类型。 - 该列直接支持数值比较操作,比如需要剔除早于6点、晚于22点的数据,可以直接写筛选逻辑:
# 仅保留6点到22点之间的数据 df = df[df['Time'].between(pd.Timedelta(hours=6), pd.Timedelta(hours=22))] - 如果你一定要基于已经生成的
dt.time列做转换,可以先将time对象转为字符串再传入转换函数,但该方法效率更低、对异常值容错差,不推荐使用:df['Time'] = pd.to_timedelta(df['Time'].astype(str))
内容的提问来源于stack exchange,提问作者Addi O
相关产品推荐
相关产品推荐

