如何按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
相关产品推荐
相关产品推荐

