使用Pandas重采样时出现DataError: No numeric types to aggregate错误的求助
解决重采样报错「DataError: No numeric types to aggregate」的问题
嘿,我来帮你拆解下这个问题~你遇到的报错核心其实有两个关键原因,咱们一个个说清楚:
1. 最可能的根源:value列并非数值类型
虽然你观察到数值列应该是数值格式,但Pandas大概率把它识别成了**字符串(object类型)**或者其他非数值类型,导致mean()聚合方法找不到可计算的数值列,自然就报错了。
排查方法:
先确认value列的数据类型,运行这两行代码就能清楚:
print(dataframe['value'].dtype) # 或者查看整个DataFrame的详细信息 dataframe.info()
如果输出结果是object,那就坐实了这个问题。
解决方法:
把value列强制转换为数值类型,用pd.to_numeric()处理,同时通过errors='coerce'把无法转换的异常值(比如空字符串、特殊字符)转为NaN,不影响后续聚合计算:
# 注意:这一步要放在设置索引之前执行 dataframe['value'] = pd.to_numeric(dataframe['value'], errors='coerce')
2. 容易忽略的参数错误:重采样频率写错了!
你代码里的resample('1M')是**按月份(Month end)**重采样,完全不是你想要的1分钟粒度!如果要实现1分钟的时间聚合,应该用'1min'或者缩写'T':
# 正确的1分钟重采样写法二选一 dataframe_minutes = dataframe.resample('1min').mean() # 或者用缩写形式 dataframe_minutes = dataframe.resample('T').mean()
修正后的完整代码
把两个问题都修复后,完整代码如下:
import pandas as pd # 将字典列表转换为DataFrame dataframe = pd.DataFrame(data) # 先转换value列为数值类型(关键步骤) dataframe['value'] = pd.to_numeric(dataframe['value'], errors='coerce') # 将毫秒时间戳转换为datetime类型 dataframe['timestamp'] = pd.to_datetime(dataframe['timestamp'], unit='ms') # 调整列顺序 dataframe = dataframe.reindex(['timestamp','value'], axis=1) # 设置timestamp列为索引 dataframe.set_index('timestamp', inplace=True) # 按1分钟粒度重采样并计算均值 dataframe_minutes = dataframe.resample('1min').mean()
这样应该就能顺利解决你的报错啦~
内容的提问来源于stack exchange,提问作者PeterBe
相关产品推荐
相关产品推荐

