PySpark中按连续6周时间段统计唯一用户数方案咨询
解决方案:统计非重叠6周周期内的唯一用户数
嗨,针对你的需求,我会用Pandas一步步实现统计2017年每个连续6周周期内的唯一用户数,代码和思路都很清晰,你可以直接套用:
步骤1:准备数据并转换日期格式
首先把你的DataFrame加载进来,然后将date列转换为Pandas的datetime类型,这是处理日期相关操作的基础:
import pandas as pd # 构建你的示例DataFrame data = { 'row': [1,2,3,4,5,6,7,8], 'date': ['2017/09/10', '2017/09/28', '2017/09/30', '2017/10/01', '2017/10/08', '2017/11/01', '2017/10/15', '2017/10/22'], 'user': ['user1','user1','user1','user1','user2','user2','user3','user3'] } df = pd.DataFrame(data) # 转换日期列 df['date'] = pd.to_datetime(df['date'])
步骤2:计算每个日期所属的6周周期
我们先提取每个日期的ISO周数(ISO周以周一为一周的开始,每年的第1周至少包含4天),然后将周数按每6周为一个分组,同时结合年份(避免跨年时周数混淆):
# 获取年份和ISO周数 df['year'] = df['date'].dt.isocalendar().year df['week'] = df['date'].dt.isocalendar().week # 计算6周周期组:每6周为一组,组号从0开始 df['6week_period'] = (df['week'] - 1) // 6 # 减1是为了让第1-6周对应组0
解释一下:(week-1)//6会把周1-6归为组0,周7-12归为组1,以此类推,完美实现非重叠的6周分组,不会出现跨组重叠的情况。
步骤3:按周期分组统计唯一用户数
最后,按year和6week_period分组,统计每个组内的唯一用户数量,还可以给周期组起个更直观的名称:
# 统计每个6周周期的唯一用户数 result = df.groupby(['year', '6week_period'])['user'].nunique().reset_index() # 生成直观的周期名称,比如"2017年第1个6周" result['period_name'] = result.apply(lambda x: f"{x['year']}年第{x['6week_period']+1}个6周", axis=1) # 输出最终结果 print(result[['period_name', 'user']])
运行结果示例
针对你的示例数据,运行后会得到如下输出:
period_name user 0 2017年第7个6周 1 1 2017年第8个6周 3 2 2017年第9个6周 1
(注:2017年9月10日属于ISO第37周,(37-1)//6=6,对应第7个6周,和示例数据的时间区间完全匹配)
补充说明
- 如果你的数据跨年度,代码里的
year分组会自动处理,不会把不同年份的周数混到同一个6周周期里。 - 如果你需要滚动式的连续6周统计(比如每过一周就统计过去6周的唯一用户数),可以改用Pandas的滚动窗口函数,但根据你的需求描述,非重叠的周期划分更贴合要求。
内容的提问来源于stack exchange,提问作者Jose Manuel Albornoz
相关产品推荐
相关产品推荐

