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

使用多键Grouper时补全缺失日期的方法求助

解决Pandas分组后缺失0值月份的问题

这个问题我之前也碰到过,Pandas的groupby默认只会保留原始数据中实际存在的分组组合,所以那些没有消耗量的月份就会被自动忽略掉。要补全这些缺失的月份,我们可以通过生成完整的时间-物料索引再重新对齐数据的方式来解决,下面是具体的实现步骤:

方法一:使用MultiIndex.from_product生成完整索引并重新索引

这种方法的核心是先构建包含所有物料+所有目标月份的完整索引,再让分组后的数据与这个索引对齐,缺失值自动填充为0:

import pandas as pd

# 1. 获取数据中所有唯一的物料
materials = consumption['Material'].unique()

# 2. 生成覆盖整个数据集的完整月度时间序列(频率为月初MS)
# 先把日期转成月度周期再转回时间戳,确保是每个月的第一天
min_month = consumption['Date'].min().to_period('MS').to_timestamp()
max_month = consumption['Date'].max().to_period('MS').to_timestamp()
full_date_range = pd.date_range(start=min_month, end=max_month, freq='MS')

# 3. 创建包含所有物料+所有月份的多级索引
full_multi_index = pd.MultiIndex.from_product(
    [materials, full_date_range],
    names=['Material', 'Date']
)

# 4. 先完成分组求和,再用完整索引重新对齐,缺失值填充为0
consumption_grouped = consumption.groupby(
    [pd.Grouper(key='Material'), pd.Grouper(key='Date', freq='MS')]
)['QtyConsumed'].sum()\
  .reindex(full_multi_index, fill_value=0)\
  .reset_index()

方法二:使用pivot_table结合resample

如果更习惯宽表操作,可以先把数据转成“日期为行、物料为列”的格式,再通过重采样补全缺失月份,最后转回长表:

# 1. 转成宽表,自动聚合相同日期+物料的消耗量,缺失值先填0
pivot_df = consumption.pivot_table(
    index='Date',
    columns='Material',
    values='QtyConsumed',
    aggfunc='sum',
    fill_value=0
)

# 2. 按月度重采样,补全所有缺失的月份,求和(这里因为已经是月度数据,实际就是填0)
resampled_df = pivot_df.resample('MS').sum()

# 3. 转回长表格式,得到最终结果
consumption_grouped = resampled_df.unstack().reset_index(name='QtyConsumed')

效果验证

运行任意一种方法后,你就能得到包含所有月份的结果,比如你示例中缺失的2017-12-01记录会被补全,对应的QtyConsumed值为0,完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:12:57