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

为MultiIndex DataFrame的Level 1按Level 0补全日历日期索引

解决MultiIndex DataFrame按Level 0补全日期索引的问题

我来帮你搞定这个需求!针对每个Level 0分组补全其对应的完整日期范围,用pandas的分组操作结合reindex就能轻松实现,下面一步步给你演示:

第一步:构造示例数据(方便你对照操作)

先模拟一个带有日期缺失的MultiIndex DataFrame:

import pandas as pd
import numpy as np

# 构造两组有缺失的日期序列
dates_group_a = pd.date_range('2023-01-01', '2023-01-05', freq='2D')  # 缺2023-01-02、04
dates_group_b = pd.date_range('2023-01-03', '2023-01-07', freq='3D')  # 缺2023-01-04、05、06

# 生成MultiIndex和DataFrame
index = pd.MultiIndex.from_tuples(
    [('A', d) for d in dates_group_a] + [('B', d) for d in dates_group_b],
    names=['Level0', 'Level1']
)
df = pd.DataFrame({'value': np.random.randn(5)}, index=index)

第二步:核心补全逻辑

通过groupby按Level 0分组,对每个分组生成从最小日期到最大日期的完整日历序列,再用reindex补全行:

def fill_group_dates(group):
    # 获取当前分组的日期边界
    min_date = group.index.min()
    max_date = group.index.max()
    # 生成完整日历日期序列
    full_date_range = pd.date_range(min_date, max_date, freq='D')
    # 重新索引补全,缺失值默认用NaN填充
    return group.reindex(full_date_range)

# 分组应用补全函数,再整理索引格式
filled_df = df.groupby(level='Level0').apply(fill_group_dates)
filled_df = filled_df.reset_index(level=0, drop=False).rename_axis(['Level0', 'Level1'])

可选:自定义缺失值填充规则

如果不想用NaN填充缺失值,可以修改reindex的参数,或者用填充方法:

  • 用固定值(比如0)填充:
def fill_with_fixed_value(group):
    min_date = group.index.min()
    max_date = group.index.max()
    full_date_range = pd.date_range(min_date, max_date, freq='D')
    return group.reindex(full_date_range, fill_value=0)
  • 前向填充(用上一个有效值填充):
def fill_with_ffill(group):
    min_date = group.index.min()
    max_date = group.index.max()
    full_date_range = pd.date_range(min_date, max_date, freq='D')
    return group.reindex(full_date_range).ffill()

验证结果

比如查看分组'A'的索引,就能看到已经补全了所有日历日期:

print(filled_df.loc['A'].index)

内容的提问来源于stack exchange,提问作者feetwet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:10:57