You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算经格式化后为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:35:21