【问题标题】:Grouping irregular timestamp data and label according to Group根据Group对不规则的时间戳数据和标签进行分组
【发布时间】:2019-08-01 09:19:37
【问题描述】:

我以不规则的时间间隔收到传入数据。数据按12​​0秒分组时解码有用信息,但起始时间不固定。下面的示例 df。

    TIME                SPEED
0   19-01-18 10:25:43   1425
1   19-01-18 10:25:45   1425
2   19-01-18 10:25:46   1425
3   22-12-18 23:25:56   1435
4   23-12-18 00:00:15   1433
5   29-10-18 00:37:15   1388
6   29-10-18 00:39:18   1388
7   29-10-18 00:39:40   1388

Q1) 在这种情况下,Pandas 是否可以根据用户的时间间隔(例如 120 秒)对时间戳进行分组;和 Q2) 相应地标记它们,如下所示:

    TIME                SPEED   Group
0   19-01-18 10:25:43   1425      1
1   19-01-18 10:25:45   1425      1
2   19-01-18 10:25:46   1425      1
3   22-12-18 23:25:56   1435      2
4   23-12-18 00:00:15   1433      2
5   29-10-18 00:37:15   1388      3
6   29-10-18 00:39:18   1388      4
7   29-10-18 00:39:40   1388      4

所以第一个周期/组从 19-01-18 10:25:43 开始。 120 秒内的任何数据都将被组合在一起。第二个周期将从下一个可用时间戳(22-12-18 23:25:56)开始,距离时间戳 120 秒。该过程将继续。
如果非常感谢任何提示。

【问题讨论】:

  • 查看具有 Group == 2 的行。第一个记录在 22-12-18 20:25:56,第二个记录在 23-12-18 00:00:15。如果他们相隔大约 3 小时 30 分钟( 超过 120 秒),您为什么决定将他们纳入同一组?
  • 对不起。 #3 数据应该是 3 22-12-18 23:25:56 1435

标签: python pandas time


【解决方案1】:

pandas.Grouperngroup 一起使用:

import pandas as pd

df['TIME'] = pd.to_datetime(df['TIME'], dayfirst=True)
s = df.groupby(pd.Grouper(key='TIME', freq='120s')).ngroup()
df['Group'] = s.groupby(s).ngroup().add(1)
print(df)

输出:

                 TIME  SPEED  Group
0 2018-01-19 10:25:43   1425      1
1 2018-01-19 10:25:45   1425      1
2 2018-01-19 10:25:46   1425      1
3 2018-12-22 20:25:56   1435      4
4 2018-12-23 00:00:15   1433      5
5 2018-10-29 00:37:15   1388      2
6 2018-10-29 00:39:18   1388      3
7 2018-10-29 00:39:40   1388      3

【讨论】:

    【解决方案2】:

    Series.dt.floorfactorizeSeries.rank 一起使用:

    df['TIME'] = pd.to_datetime(df['TIME'], dayfirst=True)
    
    df['G'] = pd.factorize(df['TIME'].dt.floor('120S'))[0] + 1
    print (df)
                     TIME  SPEED  G
    0 2018-01-19 10:25:43   1425  1
    1 2018-01-19 10:25:45   1425  1
    2 2018-01-19 10:25:46   1425  1
    3 2018-12-22 20:25:56   1435  2
    4 2018-12-23 00:00:15   1433  3
    5 2018-10-29 00:37:15   1388  4
    6 2018-10-29 00:39:18   1388  5
    7 2018-10-29 00:39:40   1388  5
    

    df['TIME'] = pd.to_datetime(df['TIME'], dayfirst=True)
    
    df['G'] = df['TIME'].dt.floor('120S').rank(method='dense').astype(int)
    print (df)
                     TIME  SPEED  G
    0 2018-01-19 10:25:43   1425  1
    1 2018-01-19 10:25:45   1425  1
    2 2018-01-19 10:25:46   1425  1
    3 2018-12-22 20:25:56   1435  4
    4 2018-12-23 00:00:15   1433  5
    5 2018-10-29 00:37:15   1388  2
    6 2018-10-29 00:39:18   1388  3
    7 2018-10-29 00:39:40   1388  3
    

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 2011-01-31
      • 1970-01-01
      • 2020-12-29
      • 2022-07-22
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      相关资源
      最近更新 更多