首页 > 解决方案 > 行之间的熊猫日期时间增量按另一列分组

问题描述

当它按熊猫数据帧中的特定列分组时,我正在尝试计算行之间的时间差(以天为单位)。仅当没有分组依据时,日期差异才有效。如何应用分组依据并计算行之间的日期差异?在它下面也给了我相反的结果,但我想从下到上计算时差。我错过了什么?这是我到目前为止所尝试的。

.csv 文件示例

group_id,code,date,number
123,abc,2021-02-18,4
123,def,2020-11-11,3
123,ghi,2020-11-10,2
123,jkl,2020-10-01,1
456,gtg,2020-11-28,5
456,abd,2020-10-30,4
456,def,2020-10-05,3
456,jkl,2020-10-01,2
456,uuu,2020-10-01,1

我的代码:

df = pd.read_csv('../sample/sample.csv')
print(df)
df['date'] = pd.to_datetime(df['date']) # convert date type

尝试#1:有效但未分组并从顶行到底行计算。

df['deltaT'] = (df['date'].shift()-df['date'])

尝试#2:错误

df['group_id'].shift().where(df['date'].shift()-df['date']) # ValueError: Boolean array expected for the condition, not object

我试图得到这个结果:

group_id,code,date,number, deltaT
123,abc,2021-02-18,4, 99 days
123,def,2020-11-11,3, 1 days
123,ghi,2020-11-10,2, 40 days
123,jkl,2020-10-01,1, 0
456,gtg,2020-11-28,5, 29 days
456,abd,2020-10-30,4, 25 days
456,def,2020-10-05,3, 4 days
456,jkl,2020-10-01,2, 0 days
456,uuu,2020-10-01,1, 0

标签: pythonpython-3.xpandas

解决方案


尝试这个 -

(df.groupby(['group_id'])['date'].shift() - df['date']).shift(-1)
0   99 days
1    1 days
2   40 days
3       NaT
4   29 days
5   25 days
6    4 days
7    0 days
8       NaT
Name: date, dtype: timedelta64[ns]

因此,您可以直接.shift()在 grouper 对象的日期列上使用,将每个组的日期移动 1,然后从中减去原始日期。

  1. 最后的.shift(-1)(反向移位)只是为了使结果与您在上面的问题中如何构建它的预期输出保持一致。如果不需要,您可以安全地删除它。
  2. 此外,如果您需要将NaT值替换为 0,您可以使用.shift(fill_value=0)您正在使用的两个班次。

注意:由于您要从组移位的日期中减去原始日期,请确保数据按(组,日期)排序,否则可能会导致不良结果!


推荐阅读