如何用Pandas填充缺失工作日的最近日期金融数据?
解决Pandas工作日缺失值前向填充的问题
嘿,这个需求我熟!不用手动遍历每一行那么麻烦,Pandas里有一套简洁的向量化操作就能搞定,而且效率比循环高太多了,刚好匹配你“仅针对工作日、用之前最近日期数据填充”的要求。
核心思路
我们需要先把缺失的工作日补全到DataFrame的索引里,再用**前向填充(forward fill)**的方式,让缺失的工作日自动继承上一个有效工作日的数据。
具体步骤(附代码示例)
先构造一个和你场景类似的示例数据:
import pandas as pd import numpy as np # 构造带缺失工作日的示例数据 # 先生成2024年1月1日-1月10日的工作日,然后故意删掉1月2日、1月4日 original_dates = pd.date_range(start='2024-01-01', end='2024-01-10', freq='B') original_dates = original_dates.drop([original_dates[1], original_dates[3]]) df = pd.DataFrame({'close_price': [100, 102, 101, 103, 104]}, index=original_dates) print("原始数据(缺失部分工作日):") print(df)
接下来执行填充操作:
生成完整的工作日索引
用pd.date_range加上freq='B'(代表Business Day,自动排除周六周日),生成你数据时间范围内的所有工作日:# 获取完整的工作日序列 full_business_days = pd.date_range(start=df.index.min(), end=df.index.max(), freq='B')重新索引补全缺失工作日
用reindex把原DataFrame的索引替换成完整的工作日序列,缺失的工作日会自动填充为NaN:df_full = df.reindex(full_business_days)前向填充缺失值
用ffill()方法(全称forward fill),让每个NaN位置自动用上一个最近的非缺失值填充:df_filled = df_full.ffill() print("\n填充后的数据(补全所有工作日):") print(df_filled)
额外处理:如果原数据混有非工作日
如果你的原始DataFrame里不小心包含了周六/周日这类非工作日的数据,可以先过滤掉:
# 方法1:用isin匹配工作日序列 df = df[df.index.isin(pd.bdate_range(df.index.min(), df.index.max()))] # 方法2:通过星期几过滤(周一到周五对应0-4) df = df[df.index.dayofweek < 5]
为什么不用手动遍历?
手动循环遍历每一行的方式在数据量小的时候看似可行,但数据量一大(比如几年的日度数据),速度会慢得离谱。Pandas的reindex和ffill都是向量化操作,底层用C实现,效率能提升几十甚至上百倍。
内容的提问来源于stack exchange,提问作者dineshdileep
相关产品推荐
相关产品推荐

