Python 熊猫分组中连续日期之间的差异

Python 熊猫分组中连续日期之间的差异,python,pandas,datetime,dataframe,group-by,Python,Pandas,Datetime,Dataframe,Group By,我有一个数据框,如下所示: df_raw_dates = pd.DataFrame({"id": [102, 102, 102, 103, 103, 103, 104], "val": [9,2,4,7,6,3,2], "dates": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3),

我有一个数据框,如下所示:

df_raw_dates = pd.DataFrame({"id": [102, 102, 102, 103, 103, 103, 104], "val": [9,2,4,7,6,3,2], "dates": [pd.Timestamp(2002, 1, 1), pd.Timestamp(2002, 3, 3), pd.Timestamp(2003, 4, 4), pd.Timestamp(2003, 8, 9), pd.Timestamp(2005, 2, 3), pd.Timestamp(2005, 2, 8), pd.Timestamp(2005, 2, 3)]})

    id  val      dates
0  102    9 2002-01-01
1  102    2 2002-03-03
2  102    4 2003-04-04
3  103    7 2003-08-09
4  103    6 2005-02-03
5  103    3 2005-02-08
6  104    2 2005-02-03
我想要实现的是,不要让dates列具有diff_dates列,该列将表示每个id的连续日期之间的差异,其中diff_dates列中每个id的第一个条目将为0。因此,生成的数据帧应为:

df_processed_dates = pd.DataFrame({"id": [102, 102, 102, 103, 103, 103, 104], "val": [9,2,4,7,6,3,2], "diff_dates": [0, 61, 397, 0, 544, 5, 0]})

    id  val  diff_dates
0  102    9           0
1  102    2          61
2  102    4         397
3  103    7           0
4  103    6         544
5  103    3           5
6  104    2           0
期待您的回答

使用+。然后,您可以提取days组件并使用填充填充缺少的条目

要将其重新指定为新列,请执行以下操作

df_raw_dates['date_diff'] = (
    df_raw_dates
       .pop('dates')
       .groupby(df_raw_dates['id'])
       .diff()
       .dt.days
       .fillna(0, downcast='infer'))


df_raw_dates

    id  val  date_diff
0  102    9          0
1  102    2         61
2  102    4        397
3  103    7          0
4  103    6        544
5  103    3          5
6  104    2          0

唯一的评论是我想用新列返回准确的数据框。嘿@coldspeed我发布了另一个问题Impute missing value。。不久前,你介意看一看吗?
df_raw_dates['date_diff'] = (
    df_raw_dates
       .pop('dates')
       .groupby(df_raw_dates['id'])
       .diff()
       .dt.days
       .fillna(0, downcast='infer'))


df_raw_dates

    id  val  date_diff
0  102    9          0
1  102    2         61
2  102    4        397
3  103    7          0
4  103    6        544
5  103    3          5
6  104    2          0