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

按machineId和id分组计算时间均值报错:无法转时间为数值

解决时间格式列分组求均值的类型错误

场景与问题

每周生成一份CSV文件,合并多周数据后得到如下结构的DataFrame:

machineIdidmeanminmax
machine1200:00:03.4700:00:00.0200:00:06.11
machine1100:00:01.3000:00:00.7400:00:01.86
machine1200:00:00.3500:00:00.0100:00:00.99
machine1200:00:01.6300:00:00.6700:00:02.60
machine1300:00:00.6600:00:00.0300:00:01.91

需要按machineId和id分组,计算mean、min、max列的均值,执行以下代码时触发类型错误:

df = df.groupby(['machineId','id']).agg({'mean': 'mean','min':'mean','max':'mean'})

错误信息:TypeError: Could not convert 00:00:03.47 to numeric

错误原因

mean、min、max列的内容是时分秒.毫秒格式的字符串,Pandas无法直接将字符串类型识别为数值进行均值运算,必须先转换为时间差(timedelta)类型。

解决步骤

1. 转换时间列类型为timedelta

使用pd.to_timedelta()方法将字符串格式的时间列转换为Pandas支持的时间差类型:

import pandas as pd

# 指定需要转换的时间列
time_columns = ['mean', 'min', 'max']
df[time_columns] = df[time_columns].apply(pd.to_timedelta)

2. 分组计算均值

转换后即可正常执行分组聚合操作:

# 分组并计算均值
result_df = df.groupby(['machineId', 'id']).agg({
    'mean': 'mean',
    'min': 'mean',
    'max': 'mean'
}).reset_index()

3. 可选:将结果转回时分秒字符串格式

如果需要把计算后的timedelta结果还原为原格式的字符串,可自定义转换函数:

def timedelta_to_str(timedelta_obj):
    total_sec = timedelta_obj.total_seconds()
    hours = int(total_sec // 3600)
    minutes = int((total_sec % 3600) // 60)
    seconds = total_sec % 60
    # 格式化为时分秒.毫秒的字符串
    return f"{hours:02d}:{minutes:02d}:{seconds:06.2f}"

# 应用转换函数到目标列
result_df[time_columns] = result_df[time_columns].applymap(timedelta_to_str)

内容的提问来源于stack exchange,提问作者ranqnova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:10:34