pandas按日期区间分组求和pageviews 生成PT+3/PT+30统计列
pandas 实现文章分时段浏览量聚合统计
实现思路
- 首先将所有日期相关字段统一转换为
datetime类型,避免日期比较逻辑出错 - 为每条浏览明细数据新增区间标记,判断当前浏览记录是否落在PT+3、PT+30的统计窗口内
- 按聚合维度分组统计,对文章固定属性字段取首个值,对不同统计窗口的浏览量做条件求和
- 最后调整输出列顺序,匹配要求的字段规范
完整实现代码
import pandas as pd # 1. 预处理:统一日期字段格式 date_cols = ['Published Date', 'T+3', 'T+30', 'date'] df[date_cols] = df[date_cols].apply(pd.to_datetime) # 2. 标记每条浏览记录所属统计窗口 # PT+3窗口:发布日期 <= 浏览日期 < T+3 df['is_pt3'] = (df['date'] >= df['Published Date']) & (df['date'] < df['T+3']) # PT+30窗口:T+3 <= 浏览日期 < T+30(即30天内剔除前3天的部分) df['is_pt30'] = (df['date'] >= df['T+3']) & (df['date'] < df['T+30']) # 3. 分组聚合计算(默认按文章+国家维度聚合,匹配输出字段Country的单值要求) result = df.groupby(['Title', 'country'], as_index=False).agg( **{ 'Post ID': ('Post ID', 'first'), 'Published Date': ('Published Date', 'first'), 'Permalink': ('Permalink', 'first'), 'Categories': ('Categories', 'first'), 'Author Name': ('Author Name', 'first'), 'Total Page Views': ('pageviews', 'sum'), 'PT+3': ('pageviews', lambda x: x[df.loc[x.index, 'is_pt3']].sum()), 'PT+30': ('pageviews', lambda x: x[df.loc[x.index, 'is_pt30']].sum()) } ) # 4. 调整列顺序、重命名字段匹配输出要求 result = result[['Post ID', 'Published Date', 'Title', 'Permalink', 'Categories', 'Author Name', 'Total Page Views', 'country', 'PT+3', 'PT+30']] result = result.rename(columns={'country': 'Country'})
样例数据计算结果说明
针对给出的3条样例数据,所有浏览记录的date均为2022-05-24、2022-05-26,晚于T+3日期2022-05-13、早于T+30日期2022-06-09,因此计算结果为:
- 澳大利亚:Total Page Views=24,PT+3=0,PT+30=24
- 印度:Total Page Views=36,PT+3=0,PT+30=36
注意事项
- 日期区间默认采用左闭右开规则,避免T+3当天的浏览量被重复统计到PT+3和PT+30两个字段中,如果业务规则需要将T+3当天的浏览量计入PT+3,调整判断条件的不等号即可
- 如果不需要分国家统计,要将同一文章所有国家的浏览量汇总,只需修改两处:
- 移除
groupby中的'country'参数 - 在聚合逻辑中新增Country字段的拼接规则:
'Country': ('country', lambda x: '|'.join(sorted(x.unique())))
- 移除
- 聚合逻辑默认同一
Title对应的Post ID、发布日期、作者、分类等固定属性完全一致,如果存在同Title对应不同文章的异常数据,需要先做数据清洗,或者将Post ID也纳入分组键避免数据错位
内容的提问来源于stack exchange,提问作者Mina Boulos
相关产品推荐
相关产品推荐

