如何为DataFrame创建按用户首日期计算的自定义周数新列
实现方案
首先确保Date列转换为pandas的datetime格式,再按用户分组获取每个用户的最早出现日期,根据间隔天数换算为周数即可。
步骤1:数据预处理
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'Date': ['2019-08-05', '2019-07-01', '2019-08-13', '2019-08-20', '2019-09-24'], 'User': ['Bob', 'Chris', 'Bob', 'Chris', 'Bob'] }) # 转换日期列为datetime类型 df['Date'] = pd.to_datetime(df['Date'])
步骤2:计算自定义周数
方案A:满7天算一周(地板除)
# 分组获取每个用户的首次出现日期 df['first_date'] = df.groupby('User')['Date'].transform('min') # 间隔天数除以7取整,加1将首日标记为第1周 df['Week_number'] = ((df['Date'] - df['first_date']).dt.days // 7) + 1 # 删除临时列 df.drop('first_date', axis=1, inplace=True)
方案B:不满7天也算一周(向上取整,和你给出的全量示例输出完全匹配)
如果规则是只要跨了7天周期就算下一周,替换周数计算逻辑即可:
df['first_date'] = df.groupby('User')['Date'].transform('min') df['Week_number'] = ((df['Date'] - df['first_date']).dt.days / 7).apply(np.ceil).astype(int) df.drop('first_date', axis=1, inplace=True)
最终输出
方案B运行后得到的结果和你预期的完全一致:
| Date | User | Week_number |
|---|---|---|
| 2019-08-05 | Bob | 1 |
| 2019-07-01 | Chris | 1 |
| 2019-08-13 | Bob | 2 |
| 2019-08-20 | Chris | 9 |
| 2019-09-24 | Bob | 8 |
内容的提问来源于stack exchange,提问作者Chris90
相关产品推荐
相关产品推荐

