Pandas实现按参与者首条入组日期为起点计算对应周数列
实现步骤及代码
确认Date列已为datetime格式后,按ID分组取每个ID的最早日期作为入组基准,再基于日期间差计算周数即可,具体实现如下:
完整代码
import pandas as pd # 示例数据构造 data = {'ID':['A','A','A','A','A', 'B','B','B','C','C','C','C'], 'Date':['9/20/2021 4:34:57 AM', '9/21/2021 6:54:22 PM', '9/28/2021 5:54:22 PM', '9/30/2021 6:54:22 PM', '10/5/2021 6:54:22 PM', '9/4/2021 7:04:38 PM','9/9/2021 7:04:38 PM','9/17/2021 7:04:38 PM', '9/28/2021 3:21:23 AM','9/30/2021 3:21:23 AM','10/05/2021 3:21:23 AM','10/15/2021 3:21:23 AM']} df1 = pd.DataFrame(data) # 1. 转换Date列为datetime格式(若已转换可跳过此步) df1['Date'] = pd.to_datetime(df1['Date']) # 2. 按ID分组计算周数:入组日为第0天,对应第1周,每满7天周数+1 df1['week_num'] = df1.groupby('ID')['Date'].transform( lambda x: ((x - x.min()).dt.days // 7) + 1 ) # 输出结果 print(df1)
逻辑说明
- 用
groupby('ID')['Date'].transform('min')获取每个ID对应的最早日期(即入组日) - 计算每条记录日期与入组日的差值,提取天数后做整数除法(
//7)向下取整,再加1即可满足入组日(0天差)对应第1周的需求 - 若需要保留中间计算结果(入组日、天数差),可拆分计算步骤:
# 拆分步骤写法 df1['enroll_date'] = df1.groupby('ID')['Date'].transform('min') df1['days_since_enroll'] = (df1['Date'] - df1['enroll_date']).dt.days df1['week_num'] = df1['days_since_enroll'] //7 +1
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

