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

如何基于网站事件数据计算session_id?15分钟间隔生成新会话ID

生成用户会话ID的Pandas实现

会话划分的核心逻辑是:同一用户的相邻事件,若时间戳间隔超过设定阈值,则判定为新会话。结合你提供的示例,我们可以用groupby和shift方法实现无循环的高效计算,步骤如下:

步骤说明

  1. 先对数据按user_id和time_stamp排序,确保同一用户的事件按时间顺序排列
  2. 计算同一用户组内,当前事件与上一事件的时间差
  3. 标记出需要开启新会话的事件(首次事件或时间差超过阈值)
  4. 对每个用户的会话标记做累加,生成连续的session_id

完整代码实现

import pandas as pd

# 原始数据
df = pd.DataFrame([['123', 1],
                   ['123', 1],
                   ['123', 19],
                   ['234', 7],
                   ['234', 28],
                   ['234', 29]],
                   columns=['user_id', 'time_stamp'])

# 1. 按用户和时间戳排序,保证事件顺序正确
df = df.sort_values(['user_id', 'time_stamp']).reset_index(drop=True)

# 2. 定义会话超时阈值(示例中阈值为18,可根据实际业务调整)
SESSION_TIMEOUT = 18

# 3. 计算同一用户相邻事件的时间差
df['time_diff'] = df.groupby('user_id')['time_stamp'].shift(1).apply(lambda x: df['time_stamp'] - x)

# 4. 生成会话切换标记:首次事件或时间差超过阈值则标记为1
df['session_switch'] = ((df['time_diff'] > SESSION_TIMEOUT) | df['time_diff'].isna()).astype(int)

# 5. 按用户累加切换标记,得到从0开始的session_id
df['session_id'] = df.groupby('user_id')['session_switch'].cumsum() - 1

# 可选:删除中间辅助列
df = df.drop(['time_diff', 'session_switch'], axis=1)

print(df)

输出结果

运行代码后会得到与你目标一致的结果:

user_id  time_stamp  session_id
0     123           1           0
1     123           1           0
2     123          19           1
3     234           7           0
4     234          28           1
5     234          29           1

关键代码解释

  • groupby('user_id')['time_stamp'].shift(1):在每个用户的事件组内,将上一行的时间戳移到当前行,用于计算时间差
  • session_switch列:标记哪些事件是新会话的起点,isna()处理用户的第一个事件(没有上一行数据)
  • cumsum():对每个用户的切换标记累加,减1是为了让session_id从0开始计数,和示例格式匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:15:39