如何计算熊猫日期系列的平均周期持续时间?

How to calculate the average periode duration of date series with panda?

我想计算不同事件发生的平均周期持续时间。

我得到的数据中每个事件都有一个 ID,并在由其 ID 标识的一行中进行跟踪。每次事件发生时,都会保存发生日期。

df_starting_point = pd.DataFrame(
                      [{'id': 3, '0': pd.to_datetime('2020-11-23T00:00:00.000000000') , '1': np.nan, '2' : np.nan},
                       {'id': 123, '0': pd.to_datetime('2020-03-22T00:00:00.000000000') , '1': np.nan, '2' : np.nan},
                       {'id': 13215, '0': pd.to_datetime('2020-03-23T00:00:00.000000000') , '1': pd.to_datetime('2020-03-28T00:00:00.000000000'), '2' : pd.to_datetime('2020-04-03T00:00:00.000000000')},
                       {'id': 123, '0': pd.to_datetime('2020-03-22T00:00:00.000000000') , '1': pd.to_datetime('2020-03-23T00:00:00.000000000'), '2' : np.nan}
                      ])

现在我想计算以周为单位的每个相邻日期之间的距离,并计算每个 event/id 跟踪的平均周期持续时间。

我要计算的平均持续时间的数据框如下所示:

df_end_point = pd.DataFrame(
                      [{'id': 3, '0': np.nan , '1': np.nan},
                       {'id': 123, '0': np.nan , '1': np.nan},
                       {'id': 13215, '0': pd.to_datetime('2020-03-23T00:00:00.000000000') -  pd.to_datetime('2020-03-28T00:00:00.000000000'), '1': pd.to_datetime('2020-03-28T00:00:00.000000000') - pd.to_datetime('2020-04-03T00:00:00.000000000')},
                       {'id': 123, '0': pd.to_datetime('2020-03-22T00:00:00.000000000') - pd.to_datetime('2020-03-23T00:00:00.000000000'), '1': np.nan}
                      ])

有没有办法优雅地做到这一点?如果我不需要对此进行编程,我将不胜感激:)

谢谢朋友们!

根据我的理解,你可以在 axis=1,period -1 上做一个移位,然后减去,创建一个相同规格的掩码:

df_end_point = df_starting_point.set_index("id")
df_end_point= (df_end_point.sub(df_end_point.shift(-1,axis=1))
               .dropna(how='all',axis=1).reset_index())

print(df_end_point)

      id       0       1
0      3     NaT     NaT
1    123     NaT     NaT
2  13215 -5 days -6 days
3    123 -1 days     NaT

早期版本:

df_end_point = df_starting_point.set_index("id")

df_end_point = (df_end_point.diff(-1,axis=1)
                .mask(df_end_point.isna().shift(-1,axis=1).fillna(False))
                .dropna(how='all',axis=1).reset_index())