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

如何在Pandas DataFrame中按ID分组计算相邻日期差值?

计算同ID下的时间间隔时长

嘿,我来帮你搞定这个时间间隔计算的问题!你的需求是算出同一ID下当前记录和上一条记录的时间差,用Pandas的话完全不用写低效的循环,用分组+矢量化运算就能轻松搞定,步骤如下:

步骤1:把日期列转成datetime类型

首先得把你的Date列从字符串转换成Pandas的datetime类型,不然没法计算时间差:

import pandas as pd

# 转换日期格式(假设你的df已经存在)
df['Date'] = pd.to_datetime(df['Date'])

步骤2:分组计算时间差

因为要按ID分组,而且你已经按ID和时间排好序了,直接用groupby配合diff()函数就能得到每行和上一行的时间间隔:

# 计算同ID下当前行与前一行的时间差
df['Duration'] = df.groupby('ID')['Date'].diff()

diff()函数会自动在每个ID分组内,计算当前行Date减去前一行Date的差值。每组的第一行因为没有前一行数据,会得到NaN,如果你想把这些值改成0,可以用fillna()处理:

# 把NaN填充为0时长
df['Duration'] = df['Duration'].fillna(pd.Timedelta(0))

完整示例代码

用你给出的示例数据来演示整个流程:

import pandas as pd

# 创建示例DataFrame
data = {
    'Date': ['4/12/2018 7:58', '4/12/2018 8:40', '4/12/2018 8:42', '4/12/2018 9:26'],
    'ID': [1111, 1111, 1111, 1111],
    'Activity': [1, 0, 1, 0]
}
df = pd.DataFrame(data)

# 转换日期列
df['Date'] = pd.to_datetime(df['Date'])

# 计算时间间隔并填充空值
df['Duration'] = df.groupby('ID')['Date'].diff().fillna(pd.Timedelta(0))

print(df)

运行后会得到这样的结果:

Date    ID  Activity        Duration
0 2018-04-12 07:58:00  1111         1 0 days 00:00:00
1 2018-04-12 08:40:00  1111         0 0 days 00:42:00
2 2018-04-12 08:42:00  1111         1 0 days 00:02:00
3 2018-04-12 09:26:00  1111         0 0 days 00:44:00

为什么不推荐用循环?

你之前写的itertuples循环虽然能实现功能,但当数据量很大的时候,矢量化运算的速度会比循环快几十甚至上百倍,而且代码更简洁易维护,完全符合Pandas的最佳实践~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:34:21