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

pandas按id分组计算日期列相邻会话滚动小时差的实现方法

实现代码

首先需要保证同id下的会话按指定顺序排列,再分组计算差值:

import pandas as pd
from pandas import Timestamp

# 你的原数据
foo = pd.DataFrame.from_dict(data={'id': {0: '1',
  1: '1',
  2: '1',
  3: '2',
  4: '2'},
 'session': {0: 3, 1: 2, 2: 1, 3: 1, 4: 2},
 'start_time': {0: Timestamp('2021-09-02 19:49:19'),
  1: Timestamp('2021-09-16 10:54:21'),
  2: Timestamp('2021-07-12 17:11:54'),
  3: Timestamp('2021-03-02 01:53:22'),
  4: Timestamp('2021-01-09 11:38:35')}})

# 按id、session升序排序,保留原索引用于后续恢复原顺序
foo_sorted = foo.sort_values(by=['id', 'session'], ascending=True).copy()
# 按id分组计算相邻start_time的差值,转成小时单位
foo_sorted['diff_start_time'] = foo_sorted.groupby('id')['start_time'].diff().dt.total_seconds() / 3600
# 恢复原数据的行顺序
foo = foo_sorted.sort_index()
逻辑说明
  • 第一步排序是为了保证同一个id下,session号从小到大排列,确保diff()取到的是上一个session的时间
  • groupby('id')['start_time'].diff()返回的是Timedelta类型的时间差,同组的第一个session差值为NaN
  • dt.total_seconds()将时间差转换为总秒数,除以3600就得到小时单位的差值

如果你需要按时间先后顺序取上一个会话,不需要按session号排序,只需要把排序参数改成by=['id', 'start_time']即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:48:03