如何对pandas.core.series.Series类型的datetime.time数据求和?
解决pandas Series中datetime.time类型求和的TypeError问题
这个报错的原因其实很好理解:Python内置的sum()函数默认是从**0(整数类型)**开始累加的,可你Series里的元素都是datetime.time对象,整数和时间对象根本没法直接做加法,所以才抛出了这个TypeError。下面给你几个实用的解决办法:
方法1:用pandas的to_timedelta转换后求和(最推荐)
直接把Series里的时间字符串转换成timedelta(时间差)类型,pandas对这种类型的求和支持非常友好:
import pandas as pd # 将时间字符串转为timedelta类型 time_deltas = pd.to_timedelta(df.data1) # 直接调用sum方法求和 total_duration = time_deltas.sum() # 如果需要格式化输出成时分秒格式 hours = total_duration.components.hours minutes = total_duration.components.minutes seconds = total_duration.components.seconds print(f"总时长:{hours:02d}:{minutes:02d}:{seconds:02d}")
方法2:手动遍历累加,指定初始值为timedelta
如果你不想转换整个Series的类型,可以手动把每个datetime.time对象转成timedelta,再用sum()指定初始值为timedelta(0)(避免默认的int初始值):
from datetime import timedelta # 生成一个timedelta的生成器,再指定初始值求和 total_duration = sum( (timedelta(hours=t.hour, minutes=t.minute, seconds=t.second) for t in df.data1), start=timedelta(0) ) print(total_duration)
方法3:结合datetime对象转换计算
把每个datetime.time和固定日期结合成datetime对象,再通过差值计算总时长:
from datetime import datetime, date # 把每个time对象转成当天的datetime datetime_series = df.data1.apply(lambda t: datetime.combine(date.today(), t)) # 计算每个datetime与当天0点的差值,再求和 total_duration = sum( (dt - datetime.combine(date.today(), datetime.min.time()) for dt in datetime_series), start=timedelta(0) ) print(total_duration)
重要提醒:
如果你的总时长超过24小时,datetime.time类型是没法表示的(它只能存储一天内的时间),所以更推荐用timedelta类型来保存总时长,它可以轻松处理跨天的时间总和。
内容的提问来源于stack exchange,提问作者chu
相关产品推荐
相关产品推荐

