我试图计算按pandas DataFrame中特定列分组的行之间的天时间差。日期差异只有在没有分组的情况下才有效。如何应用分组并计算行之间的日期差异?下面的结果是相反的,但我想从下往上看时差。我错过了什么?以下是我到目前为止所做的尝试。
.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'])
Try #2: Errors out
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
试试这个-
(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]
因此,您可以直接在grouper对象的日期列上使用.shift()
来为每个组移动日期1。然后减去原来的日期。
- 最后的
.shift(-1)
(反向移位)只是为了使结果与您在上面的问题中如何构建它的预期输出保持一致。如果不需要,您可以安全地删除它。 - 此外,如果您需要将
NaT
值替换为0,则可以将.shift(fill_value=0)
用于您正在使用的两个移位。
注意:由于要从组移位的日期中减去原始日期,请确保数据按(group,date)排序,否则可能会导致不希望的结果!