Pandas时间序列DataFrame按特定时间过滤触发KeyError问题排查
解决交易回测中按特定时间过滤DataFrame的KeyError问题
排查与解决步骤
先确认DataFrame的真实列名
直接打印print(df.columns.tolist()),看看输出里有没有'timestamp'——别想当然,可能是大小写错了(比如Timestamp)、多了空格,或者列名本身是别的(比如trade_time)。检查
date_col变量的实际值
你代码里用了df.set_index(date_col),先打印print(date_col)确认它是不是等于'timestamp'。如果变量值写错了(比如写成'time'),设置索引时找不到列,后续reset_index()自然也不会有timestamp列,直接触发KeyError。确保
timestamp列是datetime类型at_time方法只对datetime类型的索引生效,先把列转成datetime:df['timestamp'] = pd.to_datetime(df['timestamp'])修正空DataFrame的判断逻辑
原代码里if 过滤后的DataFrame:的写法有问题——空DataFrame在布尔判断里会报错,改成判断行数:filtered_df = df.set_index('timestamp').at_time('09:00').reset_index() if len(filtered_df) > 0: print("worked")验证datamanager.py的字典配置
确认字典里的键值对确实对应'timestamp',而且这个配置已经正确传递到你的回测类中——比如字典是不是写成了{'date_col': 'timestamp'},并且你在代码里正确读取了这个值(没有被其他变量覆盖)。
示例代码
假设你的DataFrame列名是Timestamp,可以这么调整:
# 统一列名为timestamp df.rename(columns={'Timestamp': 'timestamp'}, inplace=True) # 转换为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 过滤09:00的数据并判断 filtered_df = df.set_index('timestamp').at_time('09:00').reset_index() if len(filtered_df) > 0: print("worked")
内容的提问来源于stack exchange,提问作者Rez
相关产品推荐
相关产品推荐

