如何在Pandas DataFrame中补全Value_dt至Business_dt的日期记录
问题描述
原始数据集:
Business_dt Value_dt ID 0 05/01/2021 01/01/2021 1 1 06/01/2021 01/01/2021 1 2 07/01/2021 01/01/2021 1 3 08/01/2021 01/01/2021 1 4 15/02/2021 13/02/2021 2 5 16/02/2021 13/02/2021 2 6 17/02/2021 13/02/2021 2 7 10/08/2021 10/08/2021 3 8 11/08/2021 10/08/2021 3
需求
当Value_dt小于Business_dt时,复制对应观测值并修改Business_dt,补全从Value_dt到该ID现有最大Business_dt之间的所有日期行,最终得到目标数据集:
Business_dt Value_dt ID 0 01/01/2021 01/01/2021 1 1 02/01/2021 01/01/2021 1 2 03/01/2021 01/01/2021 1 3 04/01/2021 01/01/2021 1 4 05/01/2021 01/01/2021 1 5 06/01/2021 01/01/2021 1 6 07/01/2021 01/01/2021 1 7 08/01/2021 01/01/2021 1 8 13/02/2021 13/02/2021 2 9 14/02/2021 13/02/2021 2 10 15/02/2021 13/02/2021 2 11 16/02/2021 13/02/2021 2 12 17/02/2021 13/02/2021 2 13 10/08/2021 10/08/2021 3 14 11/08/2021 10/08/2021 3
尝试的代码(未成功)
df.date_range = pd.date_range(df.valdt, df.business_date - timedelta(days = df.report_diff), freq='d')
解决方案
核心思路是按ID分组,对每个分组生成从唯一Value_dt到分组内最大Business_dt的日期序列,再关联对应的Value_dt和ID。
步骤1:转换日期格式
先把字符串日期转为datetime类型,方便后续日期运算:
import pandas as pd # 读取原始数据(若已有DataFrame可跳过此初始化) df = pd.DataFrame({ 'Business_dt': ['05/01/2021', '06/01/2021', '07/01/2021', '08/01/2021', '15/02/2021', '16/02/2021', '17/02/2021', '10/08/2021', '11/08/2021'], 'Value_dt': ['01/01/2021', '01/01/2021', '01/01/2021', '01/01/2021', '13/02/2021', '13/02/2021', '13/02/2021', '10/08/2021', '10/08/2021'], 'ID': [1,1,1,1,2,2,2,3,3] }) # 转换日期列,注意格式为dd/mm/yyyy df['Business_dt'] = pd.to_datetime(df['Business_dt'], format='%d/%m/%Y') df['Value_dt'] = pd.to_datetime(df['Value_dt'], format='%d/%m/%Y')
步骤2:按ID生成完整日期序列
遍历每个ID分组,生成日期范围并构建新的DataFrame:
result = [] for id_num, group in df.groupby('ID'): # 获取该ID对应的唯一Value_dt value_dt = group['Value_dt'].iloc[0] # 获取该ID的最大Business_dt max_business_dt = group['Business_dt'].max() # 生成从Value_dt到max_business_dt的所有日期 date_range = pd.date_range(start=value_dt, end=max_business_dt, freq='D') # 构建当前ID的所有行 id_df = pd.DataFrame({ 'Business_dt': date_range, 'Value_dt': value_dt, 'ID': id_num }) result.append(id_df) # 合并所有分组结果 final_df = pd.concat(result, ignore_index=True) # 转换回原日期格式输出 final_df['Business_dt'] = final_df['Business_dt'].dt.strftime('%d/%m/%Y') final_df['Value_dt'] = final_df['Value_dt'].dt.strftime('%d/%m/%Y') print(final_df)
运行上述代码后,即可得到符合需求的目标数据集。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

