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

基于延后32天时间戳查询商品期货价格报错求助

问题解决思路及修正代码

报错原因

KeyError本质是你用data.at[x,'CU00.SHF']时,x对应的Timestamp不在DataFrame的索引里——要么是索引日期格式不匹配,要么是该日期本身不在数据范围内,再加上原函数的逻辑错误,导致生成的日期根本不存在于数据中。

分步修正方案

1. 先规范DataFrame的索引

确保history_date是datetime类型并设为索引,这是后续日期查找的基础:

import pandas as pd
from datetime import timedelta

# 把history_date转成datetime类型,设为索引并排序去重
data['history_date'] = pd.to_datetime(data['history_date'])
data = data.set_index('history_date').sort_index().drop_duplicates()

2. 修复next_trade_day函数

原函数里break写在return前面,永远执行不到return,而且逻辑错误(累加x会导致延后天数远超32天),重新梳理逻辑:

def next_trade_day(x):
    # 把索引的datetime值转成date类型
    x_date = x.date()
    # 先计算延后32天的初始目标日期
    target_date = x_date + timedelta(days=32)
    # 循环往后找第一个交易日
    while not is_workday(target_date):
        target_date += timedelta(days=1)
    return pd.Timestamp(target_date)

3. 修复end_price函数(支持多列,避免KeyError)

改用loc配合索引检查,同时支持指定商品列,不用重复写多个函数:

def end_price(target_ts, col_name):
    # 先检查目标日期是否存在于索引中
    if target_ts in data.index:
        return data.loc[target_ts, col_name]
    # 如果目标日期晚于数据最新日期,返回None
    elif target_ts > data.index.max():
        return None
    # 如果日期在范围内但不是交易日,可选返回最近的前一个交易日价格
    else:
        nearest_valid_date = data.index[data.index <= target_ts].max()
        return data.loc[nearest_valid_date, col_name] if pd.notna(nearest_valid_date) else None

4. 批量生成所有商品的目标价格

一次性处理你需要的所有商品列:

# 给每一行生成对应的目标交易日
data['target_trade_day'] = data.index.map(next_trade_day)

# 需要处理的商品列列表
commodity_cols = ['CU00.SHF', 'AU00.SHF', 'SC00.SHF', 'I8888.DCE', 'C00.DCE']

# 循环生成每个商品的延后32天价格列
for col in commodity_cols:
    data[f'{col}_32d_later_price'] = data['target_trade_day'].apply(end_price, col_name=col)

关键注意点

  • 不要返回字符串'None',用Python原生的None,方便后续数据清洗和分析
  • 确保is_workday函数的输入是date类型(和代码里的target_date匹配),如果该函数要求datetime类型,就把target_date转成datetime再传入
  • 索引必须有序且无重复,否则data.index[data.index <= target_ts].max()会出错

内容的提问来源于stack exchange,提问作者Arthur Zhang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:46:33