You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:10:22