如何用Pandas实现同ID下相邻日期差值计算(替代遍历循环)
解决方案:用Pandas分组+移位操作实现日期差计算
当然可以!完全不需要写for循环,Pandas的分组(groupby)和移位(shift)组合就能轻松搞定这个需求,步骤如下:
完整代码实现
import pandas as pd import numpy as np # 初始化数据集 d = {'id': [1, 2, 2, 2], 'date': [np.datetime64('2019-07-01'), np.datetime64('2019-07-02'), np.datetime64('2019-07-06'), np.datetime64('2019-07-19')]} df = pd.DataFrame(data=d) # 新增diff列:计算同id下当前行与下一行的日期差 df['diff'] = df.groupby('id')['date'].shift(-1) - df['date'] # 将Timedelta类型转换为天数数值 df['diff'] = df['diff'].dt.days
代码解释
- 按id分组:
df.groupby('id')['date']确保我们只在同一个id的范围内计算日期差,不会跨id计算。 - 移位获取下一行日期:
.shift(-1)会把每个分组内的日期列向上偏移一位,这样当前行就能拿到同组下一行的日期;每个分组的最后一行因为没有下一行,会得到NaN。 - 计算日期差并转换单位:用移位后的日期减去当前行日期,得到的是
Timedelta类型(带时间单位的差值),再通过.dt.days提取天数数值,就得到了你需要的结果。
最终结果
运行代码后,df会生成你期望的输出:
| id | date | diff |
|---|---|---|
| 1 | 2019-07-01 | NaN |
| 2 | 2019-07-02 | 4.0 |
| 2 | 2019-07-06 | 13.0 |
| 2 | 2019-07-19 | NaN |
内容的提问来源于stack exchange,提问作者adamlowlife
相关产品推荐
相关产品推荐

