Pandas Grouper实现包含无数据结束日期的日度聚合
Pandas 按天聚合时补全无订单空日期的实现
针对要求的不修改原始明细数据集、不插入虚拟占位行的约束,不需要调整原有Grouper聚合逻辑,仅需要在聚合完成后通过索引对齐补全缺失日期即可,全程不会改动原始订单表t1的任何内容。
实现步骤
保留原有分组聚合代码,生成已存在订单日期的聚合结果:
daily_agg = t1.groupby(pd.Grouper(key="dt", freq="1D")).agg( no_orders=('id', 'count'), order_value=('total', 'sum'), no_reports=('noitems', 'sum') ).reset_index()生成覆盖目标全量日期范围的序列:范围从原始数据最早的订单日期开始,到指定的结束日期
2021-02-26为止,按天切分:full_dates = pd.date_range( start=t1['dt'].min().normalize(), end="2021-02-26", freq="1D" )用全量日期序列重索引聚合结果,自动补全缺失的无订单日期,对应指标值填充为0:
final_result = ( daily_agg .set_index('dt') .reindex(full_dates, fill_value=0) .rename_axis('dt') .reset_index() )
效果说明
- 补全的
2021-02-26行,no_orders、no_reports会自动填充为整数0,order_value会自动填充为浮点型0.0,和要求的输出格式完全一致 - 全程没有对原始明细DataFrame做任何插入、修改操作,完全规避了虚拟占位行的冗余问题
- 因为
pd.Grouper按天分组生成的索引默认是每日零点时间戳,和pd.date_range生成的日级时间戳格式完全匹配,不会出现日期对不上的对齐失败问题 - 后续需要调整统计的时间范围时,只需要修改
pd.date_range的start、end参数即可,原有聚合逻辑不需要改动
如果后续存在非连续的自定义日期补全需求,只需要调整
full_dates的生成规则为自定义日期列表即可,不影响后续对齐逻辑。
内容的提问来源于stack exchange,提问作者blissweb
相关产品推荐
相关产品推荐

