【问题标题】:Python - Pandas, group by time intervalsPython - Pandas,按时间间隔分组
【发布时间】:2021-03-06 00:46:04
【问题描述】:

具有以下 DF:

group_id                timestamp
       A  2020-09-29 06:00:00 UTC
       A  2020-09-29 08:00:00 UTC
       A  2020-09-30 09:00:00 UTC
       B  2020-09-01 04:00:00 UTC
       B  2020-09-01 06:00:00 UTC

我想使用所有组计算记录之间的增量,而不是计算组之间的增量。上例的结果:

delta       count
    2           2
   25           1

说明:在 A 组中,增量是

06:00:00 -> 08:00:00 (2 hours)
08:00:00 -> 09:00:00 on the next day (25 hours)

在B组中:

04:00:00 -> 06:00:00 (2 hours)

如何使用 Python Pandas 实现这一目标?

【问题讨论】:

    标签: python pandas dataframe timestamp delta


    【解决方案1】:

    代码

    df_out = df.groupby("group_id").diff().groupby("timestamp").size()
    
    # convert to dataframe
    df_out = df_out.to_frame().reset_index().rename(columns={"timestamp": "delta", 0: "count"})
    

    结果

    print(df_out)
                delta  count
    0 0 days 02:00:00      2
    1 1 days 01:00:00      1
    

    groupby-diff 产生的NaT(缺失值)被自动忽略。

    要以小时为单位表示 timedelta,只需调用 total_seconds() 方法即可。

    df_out["delta"] = df_out["delta"].dt.total_seconds() / 3600
    
    print(df_out)
       delta  count
    0    2.0      2
    1   25.0      1
    

    【讨论】:

      【解决方案2】:

      DataFrameGroupBy.diff 用于每组的差异,将Series.dt.total_seconds 转换为秒,将小时数除以3600,将最后一个计数值除以Series.value_counts,并将Series 转换为2 columns DataFrame

      df1 = (df.groupby("group_id")['timestamp']
              .diff()
              .dt.total_seconds()
              .div(3600)
              .value_counts()
              .rename_axis('delta')
              .reset_index(name='count'))
      print (df1)
         delta  count
      0    2.0      2
      1   25.0      1
      

      【讨论】:

      • 感谢您提供的出色解决方案!为了始终从组中的第一条记录计算差异,我需要更改什么? I.E 在 A 组 (2,27)。
      猜你喜欢
      • 2018-02-12
      • 2018-10-12
      • 2011-12-20
      • 1970-01-01
      • 2011-02-08
      • 2019-06-28
      • 2022-01-20
      • 1970-01-01
      • 2016-09-21
      相关资源
      最近更新 更多