You need to enable JavaScript to run this app. 如何使用pandas为日志数据按规则分配session ID(会话ID)
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pandas为日志数据按规则分配session ID(会话ID)

Pandas 实现会话ID分配方案

实现思路

  • 先将时间列转换为pandas可计算的datetime格式,保留原始数据索引避免排序打乱原顺序
  • 按用户ID和访问时间分组排序,计算同一用户相邻两次访问的时间差
  • 若为用户首次访问,或相邻访问时间差超过6小时,标记为新会话
  • 对新会话标记做全局累加,得到不同用户互不重复的全局唯一session ID

完整实现代码

import pandas as pd

# 构造示例数据,实际使用时替换为你的数据读取逻辑即可
data = {
    'user': [0, 0, 1, 0, 2, 1],
    'time': [
        '2020-05-23 00:01:19',
        '2020-05-23 00:13:32',
        '2020-05-23 00:13:45',
        '2020-05-23 12:59:45',
        '2020-05-23 13:13:13',
        '2020-05-23 15:13:45'
    ]
}
df = pd.DataFrame(data)

# 保留原始索引,后续恢复顺序用
df = df.reset_index(names='original_idx')
# 转换时间格式
df['time'] = pd.to_datetime(df['time'])
# 按用户、访问时间排序,保证同用户访问时间按升序排列
df = df.sort_values(['user', 'time'])

# 计算同用户相邻两次访问的时间差
df['time_diff'] = df.groupby('user')['time'].diff()
# 标记新会话:首次访问 或 相邻访问间隔超过6小时
df['new_session'] = df['time_diff'].isna() | (df['time_diff'] > pd.Timedelta(hours=6))
# 全局累加新会话标记,得到从0开始的唯一session_id
df['session_id'] = df['new_session'].cumsum() - 1

# 恢复原始数据顺序,删除中间计算列
df = df.sort_values('original_idx').drop(columns=['original_idx', 'time_diff', 'new_session']).reset_index(drop=True)

print(df)

输出结果

运行上述代码得到的结果和预期完全一致:

user                time  session_id
0     0 2020-05-23 00:01:19           0
1     0 2020-05-23 00:13:32           0
2     1 2020-05-23 00:13:45           1
3     0 2020-05-23 12:59:45           2
4     2 2020-05-23 13:13:13           3
5     1 2020-05-23 15:13:45           4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 19:06:07