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

如何用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)

关键步骤解释

  1. 拆分时间维度:通过dt.normalize()和dt.hour把原时间字段拆分成「日期(天)」和「小时」,确保同一小时内的记录被分到同一组,跨小时的记录不会互相干扰。
  2. 分组计算逻辑:只有当组内有2条及以上记录时才计算时间差平均值,避免单条记录产生空值;同时把时间差从秒转换为分钟,和你的结果格式一致。
  3. 格式适配:把日期转换为你示例中的DD/MM/YY格式,最终保留需要的列即可。

运行结果验证

用你提供的示例数据运行后,会得到和期望完全一致的结果:

IDweekdateavg_difference
1120/07/221.0
1120/07/221.0
1122/07/222.0
1228/07/221.0

内容的提问来源于stack exchange,提问作者kri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:35:13