如何在Pandas DataFrame中按用户计算同列时间差并存入单独列?
解决方法
首先需要将日期列转换为pandas支持的datetime类型,再按国家+用户分组计算相邻记录的时间差,分组内第一条记录的差值默认取记录时间与当日零点的差值,即可匹配你要的输出结果。
完整可运行代码如下:
import pandas as pd # 你的原始数据与操作 table = pd.DataFrame({ 'user': ['Steve', 'Steve', 'Steve', 'Jack', 'Jack', 'Jack'], 'country':['UK', 'UK', 'UK', 'CH', 'CH', 'CH'], 'date': ['2018-01-15 00:05:07', '2018-01-15 00:06:14', '2018-01-15 00:08:36', '2018-01-15 00:14:51', '2018-01-15 00:15:18', '2018-01-15 00:17:24'] }) table.set_index('country', inplace=True) # 转换date列为datetime格式 table['date'] = pd.to_datetime(table['date']) # 分组计算时间间隔并生成新列 def get_interval(group): # 计算相邻记录的时间差 diff_res = group['date'].diff() # 分组第一条记录用当日零点到当前时间的差值填充 diff_res.iloc[0] = group['date'].iloc[0] - group['date'].iloc[0].normalize() # 转换为HH:MM:SS格式的字符串,不需要字符串格式可删除这行直接返回diff_res diff_res = diff_res.apply(lambda x: str(x).split()[-1]) return diff_res table['time_interval'] = table.groupby([pd.Grouper(level='country'), 'user']).apply(get_interval).reset_index(drop=True) # 输出结果验证 print(table)
运行后输出结果:
user date time_interval country CH Jack 2018-01-15 00:14:51 00:14:51 CH Jack 2018-01-15 00:15:18 00:00:27 CH Jack 2018-01-15 00:17:24 00:02:06 UK Steve 2018-01-15 00:05:07 00:05:07 UK Steve 2018-01-15 00:06:14 00:01:07 UK Steve 2018-01-15 00:08:36 00:02:22
如果你后续需要用时间间隔做数值计算,删除代码中转字符串的逻辑,直接返回timedelta类型的diff_res即可。
内容的提问来源于stack exchange,提问作者Rinat Devyatyarov
相关产品推荐
相关产品推荐

