我有一个带有几列的pandas数据框,但是出于视觉目的,请考虑列Id
和timestamp
。如您所见,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?
答案 0 :(得分:3)
我相信您需要floor
和factorize
,最后添加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]