在Pandas DataFrame中按类别分组计算行间Datetime差值
解决DataFrame分组计算相邻时间差的问题
嘿,我来帮你搞定这个分组计算时间差的问题!你遇到的异常结果大概率是因为原方法的索引对齐出了问题,咱们换个更靠谱的方式来实现:
第一步:确保时间列是正确的datetime类型
首先得确认你的Datetime列已经转换成了pandas的datetime格式,如果还是字符串的话,减法运算肯定会出问题,先执行这一步:
df['Datetime'] = pd.to_datetime(df['Datetime'])
第二步:用内置的diff()方法分组计算时间差
pandas专门提供了diff()函数来计算序列中相邻元素的差值,配合groupby()就能轻松实现每个类别内单独计算的需求,代码简洁又靠谱:
df['Difference'] = df.groupby('Category')['Datetime'].diff()
为什么原方法会出问题?
你之前用的list(by_group.apply(...))方式,会把每个分组的计算结果转成列表再拼接,但这种方式很容易因为分组的索引和原DataFrame的索引不匹配,导致结果错位。而groupby().diff()是pandas原生支持的操作,会自动帮你处理好索引对齐的问题,每个分组内的第一行因为没有上一行数据,会显示NaN,这是合理的结果。
示例效果
比如用下面的测试数据:
import pandas as pd data = { 'Category': ['A', 'A', 'A', 'B', 'B', 'C'], 'Datetime': ['2023-01-01 10:00', '2023-01-01 10:30', '2023-01-01 11:00', '2023-01-01 09:00', '2023-01-01 09:45', '2023-01-01 12:00'] } df = pd.DataFrame(data) df['Datetime'] = pd.to_datetime(df['Datetime']) df['Difference'] = df.groupby('Category')['Datetime'].diff()
输出结果会是这样:
| Category | Datetime | Difference |
|---|---|---|
| A | 2023-01-01 10:00:00 | NaT |
| A | 2023-01-01 10:30:00 | 0 days 00:30:00 |
| A | 2023-01-01 11:00:00 | 0 days 00:30:00 |
| B | 2023-01-01 09:00:00 | NaT |
| B | 2023-01-01 09:45:00 | 0 days 00:45:00 |
| C | 2023-01-01 12:00:00 | NaT |
完全符合每个类别内重新计算时间差的需求!
内容的提问来源于stack exchange,提问作者Josephine M. Ho
相关产品推荐
相关产品推荐

