如何计算Pandas日期时间列的仅时间分量平均值?
解决Pandas DateTime列忽略日期计算时间平均值的问题
你遇到的这个报错太典型了——datetime.time对象本身不支持加法、除法这类算术运算,所以直接调用.mean()肯定会抛出类型错误。我们只需要先把时间转换成可计算的数值,求完平均再转回去就行,给你两种实用的解决方法:
方法一:将时间转换为当天总秒数计算
这是最直观的思路:把每个时间点转换成从当天00:00开始的总秒数,数值类型就能正常做均值计算了:
import pandas as pd from datetime import timedelta # 模拟你的原始数据 data = {'dte': ['2018-02-20 20:30:00', '2018-09-03 20:30:00', '2017-05-18 21:00:00', '2014-11-26 21:00:00']} df = pd.DataFrame(data) df['dte'] = pd.to_datetime(df['dte']) # 1. 把时间转成当天的总秒数 df['total_seconds'] = df['dte'].dt.hour * 3600 + df['dte'].dt.minute * 60 + df['dte'].dt.second # 2. 计算平均秒数 avg_seconds = df['total_seconds'].mean() # 3. 把平均秒数转回时间格式 avg_time = timedelta(seconds=avg_seconds).time() print(avg_time) # 输出: 20:45:00,和你的预期完全一致
方法二:用Lambda简化时间转秒操作
如果觉得上面的计算步骤有点繁琐,可以用lambda函数直接处理dt.time对象,代码更简洁:
# 直接提取time对象并转成秒数 df['time_seconds'] = df['dte'].dt.time.apply(lambda t: t.hour * 3600 + t.minute * 60 + t.second) avg_seconds = df['time_seconds'].mean() avg_time = timedelta(seconds=avg_seconds).time()
验证你的示例数据
你的四个时间对应的秒数分别是:
- 20:30:00 → 203600 +3060 = 73800秒
- 20:30:00 → 73800秒
- 21:00:00 → 21*3600 =75600秒
- 21:00:00 →75600秒
平均秒数 = (738002 +756002)/4 =74700秒,转成时间就是20小时45分钟,完全符合预期结果。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

