You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:39:48