DataFrame按UserId和Activity_date分组计算时间戳差值
按UserId和Activity_date分组计算时间戳差值
先看原始数据:
UserId Activity_date Time_stamp A 27-01-2022 13:00:00 A 27-01-2022 15:00:00 A 27-01-2022 16:00:00 A 28-01-2022 09:00:00 A 28-01-2022 11:00:00
我们要得到的结果是按用户和日期分组,计算每组内相邻时间的差值,每组第一行显示-:
UserId Activity_date Time_stamp Difference_of_time_stamp A 27-01-2022 13:00:00 - A 27-01-2022 15:00:00 02:00:00 A 27-01-2022 16:00:00 01:00:00 A 28-01-2022 09:00:00 - A 28-01-2022 11:00:00 02:00:00
你原来的代码只按UserId分组,要实现同时按两个字段分组,只需要给groupby传包含两个字段的列表就行,另外还要注意几个关键细节:
- 先把时间字符串转成可计算的datetime类型,最好和日期合并成完整的datetime对象,避免单独处理时间的逻辑漏洞
- 用
diff()计算相邻行的差值,而不是和组内第一行的差,这样才符合需求 - 把计算出的时间差转成
HH:MM:SS格式,同时把每组第一行的空值替换成-
完整代码如下:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'UserId': ['A', 'A', 'A', 'A', 'A'], 'Activity_date': ['27-01-2022', '27-01-2022', '27-01-2022', '28-01-2022', '28-01-2022'], 'Time_stamp': ['13:00:00', '15:00:00', '16:00:00', '09:00:00', '11:00:00'] }) # 合并日期和时间为完整datetime对象,方便准确计算差值 df['full_datetime'] = pd.to_datetime(df['Activity_date'] + ' ' + df['Time_stamp'], format='%d-%m-%Y %H:%M:%S') # 按UserId和Activity_date分组,计算每组内当前时间与上一个时间的差值 df['Difference_of_time_stamp'] = df.groupby(['UserId', 'Activity_date'])['full_datetime'].diff() # 自定义函数:把时间差转成HH:MM:SS格式,空值替换为'-' def format_time_diff(td): if pd.isnull(td): return '-' total_sec = int(td.total_seconds()) hours = total_sec // 3600 minutes = (total_sec % 3600) // 60 seconds = total_sec % 60 return f"{hours:02d}:{minutes:02d}:{seconds:02d}" df['Difference_of_time_stamp'] = df['Difference_of_time_stamp'].apply(format_time_diff) # 删除临时使用的full_datetime列 df = df.drop('full_datetime', axis=1) print(df)
如果需要单独获取毫秒级的差值,可以在计算出Difference_of_time_stamp后添加一行:
df['diff_milliseconds'] = df.groupby(['UserId', 'Activity_date'])['full_datetime'].diff().dt.total_seconds() * 1000
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

