基于延后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
相关产品推荐
相关产品推荐

