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

如何用Python Pandas计算DataFrame中订单分组间的时间差

问题描述

现有一个包含order_id、time和item_id字段的Pandas DataFrame,每个订单组(如A、B、C)内的订单时间一致:

order_id                 time  item_id
0        A  2022-11-10 08:43:07        1
1        A  2022-11-10 08:43:07        2
2        A  2022-11-10 08:43:07        3
3        B  2022-11-10 08:46:27        1
4        B  2022-11-10 08:46:27        2
5        C  2022-11-10 08:58:45        3

需要按时间顺序计算相邻订单组(A与B、B与C)的时间差,并存入新列time_diff,期望结果如下:

order_id                 time  item_id        time_diff
0        A  2022-11-10 08:43:07        1                 
1        A  2022-11-10 08:43:07        2                 
2        A  2022-11-10 08:43:07        3                 
3        B  2022-11-10 08:46:27        1  0 days 00:03:20
4        B  2022-11-10 08:46:27        2  0 days 00:03:20
5        C  2022-11-10 08:58:45        3  0 days 00:12:18

尝试df.groupby('order_id')['time'].diff()仅得到组内时间差,不符合需求;而df.groupby('order_id')['time'].last().diff()能得到正确的分组间差值,但不知道如何合并回原DataFrame。

解决方法

方法1:通过map映射时间差

先计算每个订单组的时间差,再利用order_id将差值映射到原DataFrame的对应行:

import pandas as pd

# 确保time列是datetime类型
df['time'] = pd.to_datetime(df['time'])

# 计算每个订单组的时间差并转为DataFrame
grouped_diff = df.groupby('order_id')['time'].last().diff().reset_index()

# 将时间差映射到原DataFrame
df['time_diff'] = df['order_id'].map(grouped_diff.set_index('order_id')['time_diff'])

# 可选:将NaT替换为空字符串,匹配期望格式
df['time_diff'] = df['time_diff'].astype(str).replace('NaT', '')

方法2:用transform直接广播差值

利用transform方法在分组后直接计算全局差值,并自动广播到组内所有行:

import pandas as pd

df['time'] = pd.to_datetime(df['time'])

# 按订单组取首条时间,计算全局时间差后广播到组内
df['time_diff'] = df.groupby('order_id')['time'].transform('first').diff()

# 可选:替换NaT为空字符串
df['time_diff'] = df['time_diff'].astype(str).replace('NaT', '')

方法3:通过merge合并结果

如果偏好合并操作,可将分组后的时间差结果与原DataFrame按order_id关联:

import pandas as pd

df['time'] = pd.to_datetime(df['time'])

# 生成带时间差的订单组DataFrame
grouped_diff = df.groupby('order_id')['time'].last().diff().to_frame('time_diff').reset_index()

# 合并到原DataFrame
df = df.merge(grouped_diff, on='order_id', how='left')

# 可选:替换NaT为空字符串
df['time_diff'] = df['time_diff'].astype(str).replace('NaT', '')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:10:36