Pandas resample重采样触发KeyError:'date'报错的解决方法
pandas DataFrame重采样触发KeyError: 'date'修复方案
报错根因
- 重复执行set_index逻辑:首次执行
set_index('date')后,date列会转为DataFrame索引,不再作为普通列存在。如果该代码块被重复触发(比如重复运行单元格、分支逻辑多次进入resample判断),后续再调用set_index('date')时找不到对应列,直接抛出KeyError。 - 聚合列名和实际数据不匹配:从提供的样例数据看,拆分后的df1、df2行情列带有
_x/_y后缀,不存在代码中写的open/high/low/close列,即使索引设置成功,聚合阶段也会触发列不存在的KeyError。 - 隐性问题:未显式将date列转为时间类型,pandas可能无法识别时间索引导致重采样逻辑异常。
可直接运行的修复代码
import pandas as pd if setting == 'resample': Freq_r = "60min" # 处理df1 # 若date不在列中,先重置索引把date转回普通列 if 'date' not in df1.columns: df1 = df1.reset_index() # 统一清理列名首尾空格,避免隐形空格导致的列匹配失败 df1.columns = df1.columns.str.strip() # 转date列为标准datetime格式 df1['date'] = pd.to_datetime(df1['date']) df1 = df1.set_index('date') # 按实际列名做聚合 df1 = df1.resample(Freq_r).agg({ 'open_x': 'first', 'high_x': 'max', 'low_x': 'min', 'close_x': 'last' }) # 处理df2 if 'date' not in df2.columns: df2 = df2.reset_index() df2.columns = df2.columns.str.strip() df2['date'] = pd.to_datetime(df2['date']) df2 = df2.set_index('date') df2 = df2.resample(Freq_r).agg({ 'open_y': 'first', 'high_y': 'max', 'low_y': 'min', 'close_y': 'last' })
可选调整
如果你希望聚合后的列名保留通用的open/high/low/close命名,可以在set_index之前增加列重命名逻辑,以df1为例:
df1 = df1.rename(columns={ 'open_x': 'open', 'high_x': 'high', 'low_x': 'low', 'close_x': 'close' })
重命名后原agg字典的键名无需修改即可正常运行。
内容的提问来源于stack exchange,提问作者Night Cheetah
相关产品推荐
相关产品推荐

