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差值为NaNdt.total_seconds()将时间差转换为总秒数,除以3600就得到小时单位的差值
如果你需要按时间先后顺序取上一个会话,不需要按session号排序,只需要把排序参数改成
by=['id', 'start_time']即可。
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

