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

如何按ID和日期分组Pandas DataFrame,组内日期间隔不超7天?

解决Pandas按ID+日期间隔≤7天分组的问题

步骤1:预处理数据(转换日期格式+排序)

首先将字符串类型的日期转为datetime格式,同时按id和date排序,确保每个ID下的日期是有序的,方便后续计算相邻日期差。

import pandas as pd

# 原始数据
df = pd.DataFrame({'id' : [1, 2, 2, 3, 3, 3, 4], 
                   'date' : ['2019-02-28', '2019-02-27', '2019-02-28', '2019-02-1', '2019-02-2', '2019-03-20', '2019-02-28'], 
                   'value' : ['a', 'b', 'c', 'c', 'a', 'b', 'c']})

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

# 按id和date升序排序
df = df.sort_values(['id', 'date']).reset_index(drop=True)

步骤2:生成日期分组标识

在每个id组内,计算当前行与前一行的日期差,当差值超过7天时,标记为新分组;通过累计求和生成每个ID下的唯一分组编号。

# 计算相邻日期的差值,每组第一行差值为NaN
df['date_diff'] = df.groupby('id')['date'].diff()

# 标记日期差超过7天的行(1表示新分组起点)
df['group_flag'] = (df['date_diff'] > pd.Timedelta(days=7)).astype(int)

# 按id累计求和,得到每个ID下的分组编号
df['group_id'] = df.groupby('id')['group_flag'].cumsum()

步骤3:聚合得到最终结果

按id和group_id分组,提取每组的最早日期,同时将组内的value合并为列表。

# 执行聚合操作
result = df.groupby(['id', 'group_id']).agg(
    date=('date', 'min'),  # 取组内最早日期
    value=('value', list)  # 合并value为列表
).reset_index(drop=True)

# 将日期转回字符串格式(匹配示例输出格式)
result['date'] = result['date'].dt.strftime('%Y-%m-%d')

# 输出结果
print(result)

最终输出

id        date      value
0   1  2019-02-28       [a]
1   2  2019-02-27    [b, c]
2   3  2019-02-01    [c, a]
3   3  2019-03-20       [b]
4   4  2019-02-28       [c]

关键逻辑说明

  • 排序是基础:只有日期有序,才能准确计算相邻行的日期差
  • 分组标识生成:通过diff()计算日期差,cumsum()累计新分组标记,实现同一ID下间隔≤7天的日期自动归组
  • 聚合操作:利用groupby的agg方法一次性完成日期提取和值列表合并

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:03:38