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

使用Pandas实现小时级累计唯一用户数计算的更优雅方法

Pandas实现小时粒度累计唯一用户统计方案

你可以直接使用pandas内置的矢量化操作实现需求,完全不需要手动遍历日志,代码简洁且执行效率远高于暴力解法,具体实现步骤如下:


步骤1:数据预处理

先读取日志并完成时间格式转换、时序排序,保证时间顺序正确是后续判断的基础:

import pandas as pd

# 读取日志文件,根据实际分隔符调整sep参数
df = pd.read_csv("你的日志文件路径", names=["username", "datetime"], skipinitialspace=True)
# 转换datetime字段为时间类型
df["datetime"] = pd.to_datetime(df["datetime"])
# 按时间升序排序,重置索引
df = df.sort_values("datetime", ascending=True).reset_index(drop=True)

步骤2:生成首次出现标记&累计用户列

用duplicated()方法直接判断用户是否为首次出现,再通过累计求和得到累计唯一用户数:

# 标记用户首次出现:duplicated()会标记非首次出现的用户为True,取反转int就是需要的0/1标记
df["is_first"] = (~df["username"].duplicated()).astype(int)
# 对标记列累计求和得到累计唯一用户数
df["cum_user_cnt"] = df["is_first"].cumsum()

执行完上述代码后,你就能得到和示例完全一致的输出结果。


可选:按小时聚合输出累计用户序列

如果你不需要保留原始日志行,只需要输出每小时粒度的累计用户结果,可以额外加一步分组聚合:

# 按小时维度分组,先算每小时新增用户数,再累计求和得到每小时结束时的累计唯一用户
hourly_cum_user = df.groupby(df["datetime"].dt.floor("H"))["is_first"].sum().cumsum().reset_index()
# 重命名列方便使用
hourly_cum_user.columns = ["hour", "cumulative_unique_user_count"]

方案优势

  1. 全程使用pandas原生矢量化操作,处理百万级以上日志时性能比暴力遍历高10~100倍
  2. 逻辑简洁无冗余,不需要手动维护用户出现的缓存集合,避免手写逻辑出错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:01