如何计算Pandas DataFrame中datetime.time类型列的时间差值?
解决Pandas中datetime.time类型无法直接相减的问题
错误原因
datetime.time类型本身不支持直接减法运算,直接对ORDER START TIME和ORDER END TIME列做差会抛出TypeError。
解决方案
根据数据是否包含日期信息,分两种场景处理:
场景1:订单开始/结束时间在同一天(无日期信息)
方法1:转为datetime类型计算差值
将时间列转换为完整的datetime64类型(默认结合1900-01-01作为日期),再计算时间差:
import pandas as pd df = pd.read_excel('/content/Haoling peak time data (1).xlsx') # 转换时间列为datetime类型 df['ORDER START TIME'] = pd.to_datetime(df['ORDER START TIME'], format='%H:%M:%S') df['ORDER END TIME'] = pd.to_datetime(df['ORDER END TIME'], format='%H:%M:%S') # 计算时间差(结果为timedelta类型,可直接查看天/时/分/秒) df['Difference'] = df['ORDER END TIME'] - df['ORDER START TIME'] # 可选:将差值转为分钟/小时数值 df['Difference_Minutes'] = df['Difference'].dt.total_seconds() / 60 df['Difference_Hours'] = df['Difference'].dt.total_seconds() / 3600
方法2:转为总秒数后做差
直接提取时间的小时、分钟、秒,计算当天的总秒数,再做差值:
import pandas as pd df = pd.read_excel('/content/Haoling peak time data (1).xlsx') # 计算时间对应的当天总秒数 df['Start_Seconds'] = df['ORDER START TIME'].apply(lambda x: x.hour * 3600 + x.minute * 60 + x.second) df['End_Seconds'] = df['ORDER END TIME'].apply(lambda x: x.hour * 3600 + x.minute * 60 + x.second) # 计算秒级差值,按需转换为分钟/小时 df['Difference_Seconds'] = df['End_Seconds'] - df['Start_Seconds'] df['Difference_Minutes'] = df['Difference_Seconds'] / 60
场景2:存在跨天订单(需结合日期信息)
如果数据包含单独的日期列(如ORDER DATE),先合并日期和时间为完整的datetime,再处理跨天情况:
import pandas as pd df = pd.read_excel('/content/Haoling peak time data (1).xlsx') # 合并日期和时间为完整datetime df['Full_Start'] = pd.to_datetime(df['ORDER DATE'].astype(str) + ' ' + df['ORDER START TIME'].astype(str)) df['Full_End'] = pd.to_datetime(df['ORDER DATE'].astype(str) + ' ' + df['ORDER END TIME'].astype(str)) # 处理跨天情况:若结束时间早于开始时间,说明跨天,给结束时间加1天 mask = df['Full_End'] < df['Full_Start'] df.loc[mask, 'Full_End'] += pd.Timedelta(days=1) # 计算最终时间差 df['Difference'] = df['Full_End'] - df['Full_Start']
内容的提问来源于stack exchange,提问作者ebdeem
相关产品推荐
相关产品推荐

