如何用Pandas按小时分组计算用户活动时间差平均值?
解决用户活动时间差平均值的分组偏差问题
你遇到的核心问题是分组粒度不够细——之前的代码只按天来分组,把同一天不同小时的访问记录混在一起计算,导致跨小时的长间隔被纳入平均值,结果出现偏差。我们只需要把分组维度细化到「ID + 周 + 日期(天) + 小时」,就能只计算同一小时内的访问时间差平均值,得到你想要的结果。
修改后的代码
import pandas as pd # 读取数据 df1 = pd.read_csv(r'C:\Users\Documents\Python\Data03.csv') # 转换日期格式为datetime类型,方便后续提取维度 df1["date"] = pd.to_datetime(df1["date"]) # 新增两个分组关键字段:纯日期(天)和小时 df1['date_day'] = df1['date'].dt.normalize() # 提取YYYY-MM-DD格式的日期部分 df1['hour'] = df1['date'].dt.hour # 提取小时数 # 按细化后的维度分组,计算每个组内的时间差平均值 # 先按时间排序,再计算相邻记录的时间差,取平均值后转换为分钟 result = df1.sort_values('date').groupby(['ID', 'week', 'date_day', 'hour'])['date']\ .agg(lambda x: x.diff().mean().total_seconds()/60 if len(x) > 1 else 0)\ .reset_index(name='avg_difference') # 将纯日期转换为你期望的DD/MM/YY格式 result['date'] = result['date_day'].dt.strftime('%d/%m/%y') # 整理成目标输出的列结构 final_result = result[['ID', 'week', 'date', 'avg_difference']].fillna(0) print(final_result)
关键步骤解释
- 拆分时间维度:通过
dt.normalize()和dt.hour把原时间字段拆分成「日期(天)」和「小时」,确保同一小时内的记录被分到同一组,跨小时的记录不会互相干扰。 - 分组计算逻辑:只有当组内有2条及以上记录时才计算时间差平均值,避免单条记录产生空值;同时把时间差从秒转换为分钟,和你的结果格式一致。
- 格式适配:把日期转换为你示例中的
DD/MM/YY格式,最终保留需要的列即可。
运行结果验证
用你提供的示例数据运行后,会得到和期望完全一致的结果:
| ID | week | date | avg_difference |
|---|---|---|---|
| 1 | 1 | 20/07/22 | 1.0 |
| 1 | 1 | 20/07/22 | 1.0 |
| 1 | 1 | 22/07/22 | 2.0 |
| 1 | 2 | 28/07/22 | 1.0 |
内容的提问来源于stack exchange,提问作者kri
相关产品推荐
相关产品推荐

