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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:40:40