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

如何用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)

接下来执行填充操作:

  1. 生成完整的工作日索引
    用pd.date_range加上freq='B'(代表Business Day,自动排除周六周日),生成你数据时间范围内的所有工作日:

    # 获取完整的工作日序列
    full_business_days = pd.date_range(start=df.index.min(), end=df.index.max(), freq='B')
    
  2. 重新索引补全缺失工作日
    用reindex把原DataFrame的索引替换成完整的工作日序列,缺失的工作日会自动填充为NaN:

    df_full = df.reindex(full_business_days)
    
  3. 前向填充缺失值
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:53:38