如何计算经格式化后为object类型的时长列的中位数?
解决时长列(object类型)的中位数计算问题
方法1:保留原始timedelta列计算(最优方案)
你最初通过df['end'] - df['start']得到的timedelta64类型列,pandas原生支持统计计算,完全没必要先转成字符串格式。直接基于原始列计算中位数即可:
# 保留原始时长差的timedelta列(建议单独存,别覆盖) df['time_delta'] = df['end'] - df['start'] # 直接计算中位数 median_duration = df['time_delta'].median() # 如果需要把中位数转成HH:MM:SS格式,用更简洁的转换方式 def format_timedelta(td): total_sec = int(td.total_seconds()) hours = total_sec // 3600 mins = (total_sec % 3600) // 60 secs = total_sec % 60 return f"{hours:02d}:{mins:02d}:{secs:02d}" formatted_median = format_timedelta(median_duration)
方法2:已转成object(字符串)后,转回timedelta再计算
如果你已经把列转成了字符串格式,先把字符串转回timedelta64类型,再进行统计:
import pandas as pd # 将HH:MM:SS格式的字符串转回timedelta df['time_timedelta'] = pd.to_timedelta(df['time']) # 计算中位数 median_duration = df['time_timedelta'].median() # 转成可读格式(用上面的format_timedelta函数即可) formatted_median = format_timedelta(median_duration)
补充:优化你的格式化函数
你原来的formatehours函数依赖utcfromtimestamp,当秒数过大时可能触发datetime范围限制,直接用秒数计算时分秒更稳妥:
def formatehours(interval): total_sec = int(interval.total_seconds()) hours = total_sec // 3600 mins = (total_sec % 3600) // 60 secs = total_sec % 60 return f"{hours:02d}:{mins:02d}:{secs:02d}"
内容的提问来源于stack exchange,提问作者Luan Brito
相关产品推荐
相关产品推荐

