按machineId和id分组计算时间均值报错:无法转时间为数值
解决时间格式列分组求均值的类型错误
场景与问题
每周生成一份CSV文件,合并多周数据后得到如下结构的DataFrame:
| machineId | id | mean | min | max |
|---|---|---|---|---|
| machine1 | 2 | 00:00:03.47 | 00:00:00.02 | 00:00:06.11 |
| machine1 | 1 | 00:00:01.30 | 00:00:00.74 | 00:00:01.86 |
| machine1 | 2 | 00:00:00.35 | 00:00:00.01 | 00:00:00.99 |
| machine1 | 2 | 00:00:01.63 | 00:00:00.67 | 00:00:02.60 |
| machine1 | 3 | 00:00:00.66 | 00:00:00.03 | 00: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
相关产品推荐
相关产品推荐

