如何在Python中根据起止时间创建时长列?解决类型错误问题
问题原因与解决方法
错误原因
你遇到的TypeError是因为你的Clock_Start和Clock_Stop列虽然标记为object类型,但实际存储的是datetime.time对象——Python的datetime.time类型不支持直接做减法运算,只有包含日期+时间的datetime.datetime类型相减,才能得到可计算的timedelta对象。
解决方案
要计算小时级别的时长,你需要先把时间数据转换成datetime.datetime类型,再进行计算:
步骤1:将时间列转为datetime类型
- 如果你的
Clock_Start和Clock_Stop是字符串格式的时间(比如"08:15:30"),直接用pd.to_datetime转换即可,函数会自动为时间补充当天的日期:
df['Clock_Start_dt'] = pd.to_datetime(df['Clock_Start']) df['Clock_Stop_dt'] = pd.to_datetime(df['Clock_Stop'])
- 如果你的列已经是
datetime.time对象,可以结合固定日期(比如当天)构造datetime.datetime:
from datetime import date, datetime df['Clock_Start_dt'] = df['Clock_Start'].apply(lambda x: datetime.combine(date.today(), x)) df['Clock_Stop_dt'] = df['Clock_Stop'].apply(lambda x: datetime.combine(date.today(), x))
步骤2:计算小时级时长
用转换后的datetime列相减,通过total_seconds()将timedelta转换为总秒数,再除以3600得到小时数(结果为浮点数,符合你需要的1.424这类格式):
df['Duration'] = (df['Clock_Stop_dt'] - df['Clock_Start_dt']).dt.total_seconds() / 3600
可选:简化写法
如果确认所有时间都属于同一天,也可以合并成一行代码:
df['Duration'] = (pd.to_datetime(df['Clock_Stop']) - pd.to_datetime(df['Clock_Start'])).dt.total_seconds() / 3600
内容的提问来源于stack exchange,提问作者afroduck
相关产品推荐
相关产品推荐

