Python 如何计算熊猫数据序列的平均周期持续时间?

Python 如何计算熊猫数据序列的平均周期持续时间?,python,pandas,date,timedelta,Python,Pandas,Date,Timedelta,我想计算不同事件发生的平均周期持续时间 我得到的数据中,每个事件都有一个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':

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

我得到的数据中,每个事件都有一个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}
                      ])
现在,我想计算周内每个相邻日期之间的距离,并计算跟踪的每个事件/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}
                      ])
有什么方法可以优雅地做到这一点吗?如果我不需要编程,我将不胜感激:)


谢谢你,我的朋友们

根据我的理解,你可以在轴=1,周期-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())

早期版本:

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())

你也可以发布预期的数据帧吗?谢谢你的提问。我相应地更新了它:)谢谢你,安基!这看起来很有希望。“明天我会试着去想一想,然后再回到美国。”雅各布:当然,慢慢来。BDW更新了一个更好的选项:)谢谢!这确实帮了我的忙:)事实证明我在寻找像diff()这样的函数。
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())