
本文介绍如何将形如“2 days 22:43:00”的字符串型时间间隔列,快速、安全地转换为浮点型总小时数,避免手动解析引发的 typeerror,并推荐使用 pandas 原生方法实现简洁可靠的转换。
在处理时间间隔数据时,常见误区是将字符串误当作 datetime 对象解析(如用 strptime),而实际输入列中存储的是 timedelta 的字符串表示(如 "2 days 22:43:00"),并非日期时间点。原代码中 datetime.strptime() 尝试解析 Timedelta 类型(或含空值/格式不一的字符串),直接导致 TypeError: strptime() argument 1 must be str, not Timedelta 错误。
正确做法是跳过手动解析,直接利用 Pandas 内置的 pd.to_timedelta() —— 它专为识别并转换各类 timedelta 字符串(包括 "X days HH:MM:SS"、"HH:MM:SS"、甚至 "X days" 或 "X h")而设计,鲁棒性强、性能高,且自动处理缺失值(返回 NaT)。
✅ 推荐解决方案(两行核心代码):
# 步骤1:将字符串列安全转换为 timedelta 类型 ser = pd.to_timedelta(mainData_Frame["Clearance Time"]) # 步骤2:提取总秒数,再换算为小时(保留浮点精度) timeData = ser.dt.total_seconds() / 3600 # 或使用 .div(3600)
执行后,timeData 即为 pd.Series 类型的数值型小时列,例如:
0 70.716667 1 36.539722 2 143.736944 dtype: float64
⚠️ 注意事项:
- 若原始列含非法格式(如 "N/A"、空字符串或纯数字),pd.to_timedelta(..., errors='coerce') 可自动将其转为 NaT,避免报错:
ser = pd.to_timedelta(mainData_Frame["Clearance Time"], errors='coerce') - 不建议使用 .apply() + 自定义函数,既低效又易出错;Pandas 向量化操作(.dt 访问器)天然支持批量计算。
- 转换后若需保留两位小数,可用 timeData.round(2),但建议先保留原始精度,后续按需格式化。
总结:面对 timedelta 字符串列,优先信任 pd.to_timedelta() 这一专有工具,配合 .dt.total_seconds() 和单位换算,即可一行逻辑、零错误完成小时制标准化,兼顾可读性、健壮性与工程效率。










