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

Pandas按ID分组补全DataFrame日期间隔并生成缺失标记、研究日新列

解决方案

实现思路

  • 首先将日期列转换为pandas支持的datetime格式,方便日期范围计算
  • 按ID分组,生成每个ID从最早到最晚日期的完整连续日期序列
  • 关联原始数据表,补全缺失的日期行,同时标记日期是否为补充的缺失值
  • 按ID分组按日期排序后,生成自增的study_day序列

完整可运行代码

import pandas as pd

# 原始数据构造
data = {'ID':['A', 'A', 'A','A', 'B', 'B', 'B', 'B', 'C', 'C'],
    'Date':['03/25/2021', '03/25/2021','03/27/2021', '03/29/2021', '03/10/2021','03/11/2021','03/15/2021','03/16/2021', '03/21/2021','03/25/2021']}
df = pd.DataFrame(data)

# 1. 转换日期列为datetime格式
df['Date'] = pd.to_datetime(df['Date'])

# 2. 生成每个ID的完整日期序列
id_date_range = df.groupby('ID')['Date'].agg(['min', 'max']).reset_index()
full_date_df = id_date_range.apply(
    lambda x: pd.Series(pd.date_range(x['min'], x['max'], freq='D'), name='Date'), 
    axis=1
).stack().reset_index(level=1, drop=True).reset_index(name='Date').merge(
    id_date_range[['ID']], on='index'
).drop('index', axis=1)

# 3. 关联原始数据补全行,标记missing_date
## 先给原始数据加存在标记
df['_exist'] = 0
## 合并完整日期表和原始表
result = full_date_df.merge(df, on=['ID', 'Date'], how='left')
## 缺失日期标记:存在标记为空则为缺失,值为1,否则为0
result['missing_date'] = result['_exist'].isna().astype(int)
result = result.drop('_exist', axis=1)

# 4. 生成study_day列,每个ID从1开始按天递增
result = result.sort_values(['ID', 'Date'], ignore_index=True)
result['study_day'] = result.groupby('ID').cumcount() + 1

print(result)

输出示例(部分)

ID       Date  missing_date  study_day
0  A 2021-03-25             0          1
1  A 2021-03-25             0          1
2  A 2021-03-26             1          2
3  A 2021-03-27             0          3
4  A 2021-03-28             1          4
5  A 2021-03-29             0          5
6  B 2021-03-10             0          1
7  B 2021-03-11             0          2
8  B 2021-03-12             1          3
...

内容的提问来源于stack exchange,提问作者shiva kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 19:45:02