Pandas为股票DataFrame补全缺失工作日行以维持数据连续性的实现方法
股票日线工作日连续补全Pandas实现
实现逻辑
- 依托Pandas内置历法计算能力,自动生成覆盖数据全时间范围的连续周一至周五序列,内置兼容闰年、跨年、月份长度差异等所有时间边界场景,无需手写日期判断逻辑
- 将原始股票数据匹配到全工作日序列,缺失日期自动生成空占位行
- 逐行向前填充空值,完全匹配“连续缺失时逐行沿用上一行数值填充”的规则,无一次性批量填充的逻辑偏差
分步代码实现
- 原始数据预处理
import pandas as pd # 读取原始数据 df = pd.read_csv("stock_data.csv") # 将Date列转换为标准日期格式,兼容不同字符串格式的日期 df["Date"] = pd.to_datetime(df["Date"]) # 去除重复日期记录,避免重索引时维度报错 df = df.drop_duplicates(subset="Date", keep="first") # 按日期升序排序,保证前向填充的顺序正确 df = df.sort_values("Date").set_index("Date")
- 生成全周期连续工作日索引
# 锁定原始数据的时间边界 start_ts = df.index.min() end_ts = df.index.max() # 生成仅包含周一至周五的连续日期序列,自动跳过所有周末 full_workday_index = pd.bdate_range(start=start_ts, end=end_ts)
- 重索引匹配+前向填充
# 将原数据对齐到全工作日序列,缺失日期自动生成空值行 df_aligned = df.reindex(full_workday_index) # 逐行前向填充所有缺失值,连续缺失时依次传递上一行的数值 df_final = df_aligned.ffill() # 可选:将日期从索引恢复为普通列,重新计算Day字段匹配实际日期,避免原Day列错位 df_final = df_final.reset_index(names="Date") # 按实际日期生成星期字段,替代原有可能存在偏差的Day列(不需要可省略) df_final["Day"] = df_final["Date"].dt.day_name()
关键注意点
- 重索引前必须完成日期去重、升序排序,否则会出现填充顺序错误、维度不匹配的报错
- 针对示例场景的匹配效果:原始数据中2007-09-21(周五)后直接到2007-09-25(周二)时,全工作日序列会自动纳入中间缺失的2007-09-24(周一),前向填充会将21日的全部字段值填充到24日行,完全符合需求规则
- 13年跨度的时间兼容性由Pandas内置的日期计算逻辑保证,无需手动判断闰年、跨年、月份天数,不会出现边界日期计算错误
- 原始数据中如果混入周六、周日的异常记录,在重索引对齐时会自动被过滤,最终数据集只保留连续的周一至周五行
内容的提问来源于stack exchange,提问作者user3424954
相关产品推荐
相关产品推荐

