如何为Pandas Series补全缺失日期并按日统计各品类数量(缺失天填0)
按日统计并补全缺失日期的解决方案
这是个很常见的时间序列补全需求,我来给你一步步拆解解决方案,先从示例数据入手,你可以直接套用到自己的数据集上。
先假设你的原始数据结构(方便演示)
假设你有这样的原始DataFrame,包含商品类型、日期和数量:
import pandas as pd data = { 'item_type': ['A', 'A', 'B', 'B', 'B'], 'date': pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-02', '2024-01-04', '2024-01-05']), 'quantity': [5, 3, 2, 4, 1] } df = pd.DataFrame(data)
方法一:用groupby + resample + 填充缺失值
这种方法最简洁,利用Pandas的分组重采样能力,自动补全每个item_type自身最小到最大日期之间的所有缺失天数,并将数量设为0:
# 核心代码 daily_result = ( df.groupby('item_type') # 对每个分组按日期列重采样为日频率,求和数量 .apply(lambda group: group.set_index('date')['quantity'].resample('D').sum()) # 填充缺失日期的数量为0 .fillna(0) # 重置索引,让结果回到清晰的列结构 .reset_index(name='daily_quantity') )
运行后你会得到每个item_type从最早到最晚日期的所有天数的统计,比如item_type A会包含2024-01-01(5)、2024-01-02(0)、2024-01-03(3)。
方法二:手动生成完整日期范围再合并
如果你需要更直观地控制日期范围(比如强制用全局的最小/最大日期,而非每个分组自己的),可以用这种方法:
# 步骤1:获取每个item_type的日期范围(如果要用全局日期,就取df['date'].min()和max()) date_ranges = df.groupby('item_type')['date'].agg(lambda x: pd.date_range(x.min(), x.max(), freq='D')) # 步骤2:展开成包含所有item_type和对应日期的DataFrame full_dates = pd.concat([ pd.DataFrame({'item_type': item, 'date': dates}) for item, dates in date_ranges.items() ]) # 步骤3:和原始数据左连接,填充缺失的数量为0,最后求和 daily_result = ( full_dates.merge(df, on=['item_type', 'date'], how='left') .fillna({'quantity': 0}) .groupby(['item_type', 'date'])['quantity'] .sum() .reset_index(name='daily_quantity') )
如果你的输入是已有的Pandas Series
如果已经通过groupby+resample得到了Series(比如s = df.groupby('item_type')['quantity'].resample('D').sum()),可以这样补全缺失值:
# 将Series转成DataFrame,展开层级索引 df_series = s.unstack(level=0) # 补全所有缺失日期为0,再重新堆叠回原结构 daily_result = df_series.asfreq('D', fill_value=0).stack().swaplevel(0, 1).sort_index().reset_index(name='daily_quantity')
关键逻辑是:unstack把item_type转成列,asfreq('D', fill_value=0)补全所有日期间隔的缺失值,再stack恢复原来的层级结构。
内容的提问来源于stack exchange,提问作者proximacentauri
相关产品推荐
相关产品推荐

