【问题标题】:Pandas: Group by unknown time periodPandas:按未知时间段分组
【发布时间】:2018-12-18 21:21:53
【问题描述】:

我有一个不同时间段的数据集。我想按 id 和每个时间段对它进行分组,但是:我不知道每个时间段有多长,甚至什么时候开始。我肯定知道的一件事:当两个时间戳之间的差异大于两分钟时,一个新的时间段开始了。

示例:这里我们有两个时间段:

  • 05:36:0705:36:42
  • 21:54:1621:54:37

数据:

id,timestamp,value
00b0f3,2018-05-21 05:36:07,4
00b0f3,2018-05-21 05:36:14,6
00b0f3,2018-05-21 05:36:24,2
00b0f3,2018-05-21 05:36:40,1
00b0f3,2018-05-21 05:36:42,6
00b0f3,2018-05-21 21:54:16,3
00b0f3,2018-05-21 21:54:27,2
00b0f3,2018-05-21 21:54:30,6
00b0f3,2018-05-21 21:54:34,4
00b0f3,2018-05-21 21:54:37,9

这应该以某种方式结束:

id,timeserie,value
00b0f3,1,19
00b0f3,2,24

是否有任何来自 pandas 的助手,可以让我检测时间之间的最大时间段?

谢谢!

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    尝试使用cumsum 和带有groupby 的布尔测试条件:

    df.groupby(['id',
               (df['timestamp'].diff() > pd.Timedelta(minutes=2)).cumsum()], 
               as_index=False)['value'].sum()
    

    输出:

           id  value
    0  00b0f3     19
    1  00b0f3     24
    

    【讨论】:

      【解决方案2】:

      您可以使用groupbypd.Grouper,如下所示:

      df = df.groupby(["id",pd.Grouper(key="timestamp", freq='2min')]).sum()
      

      结果是:

      >>> df
                                  value
      id     timestamp                 
      00b0f3 2018-05-21 05:36:00     19
             2018-05-21 21:54:00     24
      

      如果您想将id 作为单独的列,您可以在代码行下方运行:

      df.reset_index(inplace=True)
      

      然后生成的DataFrame 将是:

      >>> df
             id           timestamp  value
      0  00b0f3 2018-05-21 05:36:00     19
      1  00b0f3 2018-05-21 21:54:00     24
      

      注意

      我将您的数据粘贴到csv 文件中,然后将其导入并创建DataFrame,如下所示:

      import pandas as pd
      
      df = pd.read_csv("D:/tmp/data.csv")
      df["timestamp"] = pd.to_datetime(df["timestamp"])
      

      【讨论】:

        猜你喜欢
        • 2021-03-06
        • 2018-09-04
        • 2017-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多