如何计算Pandas中两列datetime.time的绝对时间差?
解决pandas中datetime.time类型列的绝对时间差计算问题
由于datetime.time对象不支持直接减法运算,我们需要先将其转换为可计算的数值或datetime对象,再计算时间差的绝对值并转换为小时数。以下是两种简洁的实现方法:
方法一:转换为datetime对象计算
将time类型绑定到同一日期,生成datetime对象后计算差值:
import pandas as pd import datetime # 构造原始DataFrame x = [datetime.time(23,0),datetime.time(6,0),datetime.time(18,0),datetime.time(17,0)] y = [datetime.time(22,0),datetime.time(9,0),datetime.time(9,0),datetime.time(23,0)] df = pd.DataFrame({'time1':x,'time2':y}) # 绑定到当日日期,转换为datetime对象 base_date = datetime.date.today() df['abs_diff'] = abs( df['time1'].apply(lambda t: datetime.datetime.combine(base_date, t)) - df['time2'].apply(lambda t: datetime.datetime.combine(base_date, t)) ).dt.total_seconds() // 3600
方法二:转换为总秒数计算
直接将time转换为当日的总秒数,通过数值运算得到时间差:
import pandas as pd import datetime # 构造原始DataFrame x = [datetime.time(23,0),datetime.time(6,0),datetime.time(18,0),datetime.time(17,0)] y = [datetime.time(22,0),datetime.time(9,0),datetime.time(9,0),datetime.time(23,0)] df = pd.DataFrame({'time1':x,'time2':y}) # 转换为总秒数并计算绝对小时差 df['abs_diff'] = abs( df['time1'].apply(lambda t: t.hour*3600 + t.minute*60 + t.second) - df['time2'].apply(lambda t: t.hour*3600 + t.minute*60 + t.second) ) // 3600
两种方法执行后,df['abs_diff']都会得到期望结果:[1, 3, 9, 6]
补充:处理跨天最小时间差
如果需要计算一天内的最小时间差(例如23:00到次日02:00取3小时而非21小时),可以在计算后添加逻辑:
df['abs_diff'] = df['abs_diff'].apply(lambda h: h if h <= 12 else 24 - h)
内容的提问来源于stack exchange,提问作者dcoolwater0502
相关产品推荐
相关产品推荐

