Pandas日期索引DataFrame补全缺失日期行及前向填充实现问询
解决方案
你要实现的补全日期索引的需求,直接用Pandas内置的reindex方法就能高效完成,不需要手动筛选缺失日期再拼接,操作步骤如下:
步骤1:修正全量日期生成逻辑
你当前的日期生成代码结束值写了max_date-timedelta(days=1),会漏掉原DataFrame的最后一天索引,调整为直接取max_date即可:
import pandas as pd from datetime import timedelta min_date = df.index.min() max_date = df.index.max() # 生成首尾区间内的所有自然日 date_list = pd.date_range(min_date, max_date, freq='d')
步骤2:直接补全索引+前向填充
reindex方法会自动匹配已有索引的数据,缺失日期的行默认填充NaN,后续直接链式调用ffill()就能完成前向填充,一行代码即可实现你要的效果:
# 仅补全缺失行,值为NaN df_full = df.reindex(date_list) # 补全行并直接做前向填充,和你给出的预期输出完全一致 df_full = df.reindex(date_list).ffill()
如果你确实需要单独筛选缺失日期
如果你的场景需要先拿到所有缺失的日期再做其他处理,可以用以下两种方法筛选:
# 方法1:用日期索引的difference方法,直接返回差集(推荐,效率更高) missing_dates = date_list.difference(df.index) # 方法2:用isin方法取反筛选 missing_dates = date_list[~date_list.isin(df.index)]
拿到缺失日期后再拼接的实现方式如下(不如reindex简洁,仅作参考):
# 构造缺失日期的空DataFrame df_missing = pd.DataFrame(index=missing_dates, columns=df.columns) # 拼接原数据和空数据后按日期排序 df_full = pd.concat([df, df_missing]).sort_index().ffill()
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

