如何为Pandas DataFrame填充缺失的月初首日记录以补齐完整日期序列
Pandas分组补全日期序列解决方案
前置处理
首先需要将Date列转换为Pandas datetime类型,这是所有日期处理逻辑的前提:
import pandas as pd # 转换日期列格式 tst['Date'] = pd.to_datetime(tst['Date']) uni_ind = ['% on Merchant','% on Customer','Merchants','Location']
你之前尝试的写法存在两处问题:一是resample默认仅从分组内已有最早日期开始生成序列,不会自动补全当月第一天到分组最早日期的空缺;二是语法上存在连续两个点的错误,重设索引的逻辑也冗余。
实现代码
通过分组自定义日期范围+重索引填充的方式实现需求,确保每个分组的日期从当月1日开始:
def fill_group_dates(group): # 取当前分组对应月份的第一天 month_first_day = group['Date'].min().replace(day=1) # 生成从当月第一天到分组内最大日期的完整连续日期序列 full_date_range = pd.date_range(start=month_first_day, end=group['Date'].max(), freq='D') # 重索引后用后向填充补全同组其他字段值 return group.set_index('Date').reindex(full_date_range).bfill().reset_index(names='Date') # 按指定字段分组后应用补全逻辑 result = tst.groupby(uni_ind, group_keys=False).apply(fill_group_dates).reset_index(drop=True)
逻辑说明
- 每个分组先计算对应月份的第一天作为补全的起始日期
- 生成完整连续的日期序列后通过重索引对齐,缺失的行默认填充NaN
bfill()用分组内后序存在的有效值向前填充空值,完全匹配你要求的「缺失日期沿用同组现有值」的规则- 如果需要补全到当月最后一天,只需要把
end=group['Date'].max()替换为end=group['Date'].max().to_period('M').to_timestamp(how='end').normalize()即可
内容的提问来源于stack exchange,提问作者Vamshi Krishna
相关产品推荐
相关产品推荐

