Python如何按连续日期分组统计用户不同活动的连续出现天数
问题分析
你的代码存在三个核心问题导致结果不符合预期:
- 未提前对数据按时间排序:原数据行顺序不是按时间升序排列的,
date.diff()计算的是乱序相邻行的日期间隔,结果自然错误。 - 判断条件错误:你使用了
ne(1)(只要日期间隔不等于1就触发累加),但实际上只有日期间隔大于1天才需要开启新的连续段,同一天(间隔0天)、相邻天(间隔1天)都属于同一个连续段,不需要累加。 - 未处理单日多条记录的场景:同一天的多条记录之间日期差为0,会被错误的
ne(1)条件判定为需要累加,导致同一天的记录被分到不同的组。
修正方案
你可以先提取每个用户的唯一日期序列计算连续段编号,再映射回原数据即可,完整代码如下:
# 第一步:先按Id和时间升序排序,保证时间顺序正确 sample = sample.sort_values(['Id', 'datetime']).reset_index(drop=True) # 第二步:提取每个Id的去重日期序列,计算连续段编号 unique_date_df = sample.drop_duplicates(['Id', 'date']).copy() unique_date_df['Consecutive'] = unique_date_df.groupby('Id')['date'].diff().dt.days.gt(1).cumsum() + 1 # 第三步:将连续段编号映射回原数据集 sample = sample.merge(unique_date_df[['Id', 'date', 'Consecutive']], on=['Id', 'date'], how='left')
运行上述代码后得到的Consecutive字段就和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者Kyra
相关产品推荐
相关产品推荐

