根据组对不规则的时间戳数据和标签进行分组

时间:2019-08-01 09:19:37

标签: python pandas time

我有不规则时间间隔的传入数据。根据120秒对数据进行分组时,有用信息会被解码,但开始时间不固定。下面的示例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秒处开始。该过程将继续。
任何提示,如果非常感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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