1分钟股票数据重采样为1小时后,DataFrame未包含所有CSV文件的问题求助
问题排查与解决
核心原因:未按合约分组重采样
你当前的代码将所有合约数据合并后直接全局重采样,会导致同一时间窗口内的多合约数据被强行聚合在一起。由于聚合规则里合约代码取first,每个小时段只会保留第一个出现的合约(比如a2309),其他合约的该时段数据被覆盖,最终结果自然看不到后续合约。
分步排查与修复
1. 确认数据是否完整读取与合并
在合并DataFrame后,先执行以下代码验证所有合约是否已加载:
# 打印所有已加载的唯一合约代码 print(df['合约代码'].unique()) # 统计每个合约的数据行数 print(df.groupby('合约代码').size())
如果输出里没有zn2407等合约,说明读取或合并环节出了问题:
- 先执行
print(all_files),确认文件列表是否包含目标合约的CSV文件,检查路径拼接是否正确(比如Windows路径斜杠、文件名大小写) - 修改文件读取逻辑,添加异常捕获定位问题文件:
li = [] for filename in all_files: try: df_temp = pd.read_csv(filename, index_col=None, header=0, encoding='gbk') li.append(df_temp) print(f"成功读取:{filename}") except Exception as e: print(f"读取失败 {filename}:{str(e)}") df = pd.concat(li, axis=0, ignore_index=True)
2. 按合约分组后重采样(核心修复)
正确的做法是对每个合约单独执行重采样,避免跨合约数据覆盖。修改重采样部分的代码:
df['时间'] = pd.to_datetime(df['时间']) # 按合约代码分组,每组独立执行小时重采样 df_resampled_1hr = df.groupby('合约代码').resample('H', on='时间').agg(aggregation_rules).reset_index() print(df_resampled_1hr)
这样每个合约都会生成独立的小时级数据,不会互相覆盖。
3. 额外检查:时间范围匹配性
如果zn2407等合约的时间不在2023年(你的数据路径是fut_data_1min_2023),可检查时间列的范围:
print(df['时间'].min(), df['时间'].max())
确认是否包含目标合约的有效时间区间。
内容的提问来源于stack exchange,提问作者Christal
相关产品推荐
相关产品推荐

