给定时间间隔,如何创建基于时间阈值的列?

时间:2018-11-07 09:17:12

标签: python python-3.x pandas datetime

我有一个带有几列的pandas数据框,但是出于视觉目的,请考虑列Idtimestamp。如您所见,pandas数据帧按Id列排序。

Id                timestamp

11           2018-10-19 13:00:00
11           2018-10-19 13:05:00
11           2018-10-19 13:06:00
11           2018-10-19 13:07:00
11           2018-10-19 13:30:00
11           2018-10-19 13:31:00
11           2018-10-19 13:32:00
11           2018-10-19 13:55:00
11           2018-10-19 13:54:00
11           2018-10-21 20:47:09
11           2018-10-21 20:48:27
11           2018-10-21 20:48:45
11           2018-10-21 20:48:52
12           2018-10-09 20:30:46
12           2018-10-09 20:30:22
12           2018-10-09 20:30:05
12           2018-10-09 20:29:44
12           2018-10-09 20:29:31
13           2018-10-19 18:49:08
13           2018-10-19 18:49:13
13           2018-10-11 18:46:15
14           2018-10-11 10:46:40
14           2018-10-23 10:39:52

如何基于10分钟的时间间隔创建另一个ID列?也就是说,对于每个时间戳10分钟的阈值,请创建一个新的`ID_2:

Id                timestamp            ID_2

11           2018-10-19 13:00:00        01   
11           2018-10-19 13:05:00        01
11           2018-10-19 13:06:00        01
11           2018-10-19 13:07:00        01
11           2018-10-19 13:30:00        02
11           2018-10-19 13:31:00        02
11           2018-10-19 13:32:00        02
11           2018-10-19 13:55:00        03
11           2018-10-19 13:54:00        03
11           2018-10-21 20:47:09        04
11           2018-10-21 20:48:27        04
11           2018-10-21 20:48:45        04
11           2018-10-21 20:48:52        04
12           2018-10-09 20:30:46        04
12           2018-10-09 20:30:22        04
12           2018-10-09 20:30:05        04
12           2018-10-09 20:29:44        05
12           2018-10-09 20:29:31        05
13           2018-10-19 18:49:08        06
13           2018-10-19 18:49:13        06
13           2018-10-11 18:46:15        07
14           2018-10-11 10:46:40        07

我尝试如下检测时间间隔:

df['col_new'] = (df['timestamp'].diff()).dt.seconds > 600

但是,我不明白如何应用向后填充来创建ID。因此,如何检测时间间隔并为其分配新的ID?

1 个答案:

答案 0 :(得分:3)

我相信您需要floorfactorize,最后添加zfill

df['timestamp'] = pd.to_datetime(df['timestamp'])

a = pd.factorize(df['timestamp'].dt.floor('10Min'))[0] + 1
df['col_new'] = pd.Series(a, index=df.index).astype(str).str.zfill(2)

print (df)
    Id           timestamp ID_2 col_new
0   11 2018-10-19 13:00:00   01      01
1   11 2018-10-19 13:05:00   01      01
2   11 2018-10-19 13:06:00   01      01
3   11 2018-10-19 13:07:00   01      01
4   11 2018-10-19 13:30:00   02      02
5   11 2018-10-19 13:31:00   02      02
6   11 2018-10-19 13:32:00   02      02
7   11 2018-10-19 13:55:00   03      03
8   11 2018-10-19 13:54:00   03      03
9   11 2018-10-21 20:47:09   04      04
10  11 2018-10-21 20:48:27   04      04
11  11 2018-10-21 20:48:45   04      04
12  11 2018-10-21 20:48:52   04      04
13  12 2018-10-09 20:30:46   04      05
14  12 2018-10-09 20:30:22   04      05
15  12 2018-10-09 20:30:05   04      05
16  12 2018-10-09 20:29:44   05      06
17  12 2018-10-09 20:29:31   05      06
18  13 2018-10-19 18:49:08   06      07
19  13 2018-10-19 18:49:13   06      07
20  13 2018-10-11 18:46:15   07      08
21  14 2018-10-11 18:46:40   07      08

详细信息

print (df['timestamp'].dt.floor('10Min'))
0    2018-10-19 13:00:00
1    2018-10-19 13:00:00
2    2018-10-19 13:00:00
3    2018-10-19 13:00:00
4    2018-10-19 13:30:00
5    2018-10-19 13:30:00
6    2018-10-19 13:30:00
7    2018-10-19 13:50:00
8    2018-10-19 13:50:00
9    2018-10-21 20:40:00
10   2018-10-21 20:40:00
11   2018-10-21 20:40:00
12   2018-10-21 20:40:00
13   2018-10-09 20:30:00
14   2018-10-09 20:30:00
15   2018-10-09 20:30:00
16   2018-10-09 20:20:00
17   2018-10-09 20:20:00
18   2018-10-19 18:40:00
19   2018-10-19 18:40:00
20   2018-10-11 18:40:00
21   2018-10-11 18:40:00
Name: timestamp, dtype: datetime64[ns]