【问题标题】:How to calculate the average periode duration of date series with panda?如何用熊猫计算日期系列的平均周期持续时间?
【发布时间】:2021-04-16 18:00:21
【问题描述】:

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

我得到的数据是每个事件都有一个 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}
                      ])

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

谢谢你,我的朋友们!

【问题讨论】:

  • 您也可以发布预期的数据框吗?
  • 感谢您的提问。我相应地更新了它:)

标签: python pandas date timedelta


【解决方案1】:

根据我的理解,您可以在axis=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())

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

【讨论】:

  • 谢谢你!这看起来很有希望。明天我会试着绕开它,然后回到你身边。
  • @Jakob 当然,慢慢来。 BDW 更新了一个更好的选择:)
  • 谢谢!这真的帮助了我 :) 原来我正在寻找一个像 diff() 这样的函数。
猜你喜欢
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2016-12-31
  • 2021-11-18
  • 2019-07-03
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多