如何用Python为每个ID补全缺失日期并填充0值?
按ID补全缺失日历日期并填充字段值的Pandas实现
假设你的原始DataFrame A是这样的示例结构:
import pandas as pd # 示例数据 df_a = pd.DataFrame({ 'id': ['A', 'A', 'B', 'B'], 'date_yyyymmdd': [20230101, 20230103, 20230102, 20230104], 'amount': [100, 200, 150, 300], 'hours': [8, 7, 6, 9] })
第一步:转换日期格式
先把date_yyyymmdd字段转成Pandas可识别的日期类型,方便后续生成连续日期:
df_a['date_yyyymmdd'] = pd.to_datetime(df_a['date_yyyymmdd'], format='%Y%m%d')
第二步:生成每个ID的完整日期序列
先定义指定的起止日期,然后生成该范围内的所有日历日期,再和所有唯一ID做笛卡尔积,得到每个ID对应的完整日期组合:
start_date = pd.to_datetime('20230101', format='%Y%m%d') end_date = pd.to_datetime('20230105', format='%Y%m%d') # 生成起止日期之间的所有日期 date_range = pd.date_range(start=start_date, end=end_date) # 获取所有唯一ID unique_ids = df_a['id'].unique() # 创建ID和日期的笛卡尔积,得到完整的日期框架 full_dates = pd.MultiIndex.from_product([unique_ids, date_range], names=['id', 'date_yyyymmdd']).reset_index()
第三步:合并数据并填充缺失值
将原始数据和完整日期框架合并,对缺失的amount和hours字段填充0:
df_b = pd.merge(full_dates, df_a, on=['id', 'date_yyyymmdd'], how='left') df_b[['amount', 'hours']] = df_b[['amount', 'hours']].fillna(0) # 如果需要把日期转回原格式(整数类型的yyyymmdd),可以加这一步 df_b['date_yyyymmdd'] = df_b['date_yyyymmdd'].dt.strftime('%Y%m%d').astype(int)
运行完以上代码后,df_b就是你需要的结果:每个ID都包含了20230101到20230105的所有日期,缺失日期对应的amount和hours都被填充为0。
内容的提问来源于stack exchange,提问作者bunti papu
相关产品推荐
相关产品推荐

