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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:21:56