Как создать столбец на основе временного порога с учетом временного разрыва? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть кадр данных 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

Как создать еще один столбец ID на основе промежутков времени в 10 минут? То есть для каждой временной отметки 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

Однако я не понимаю, как применить обратную заливку для создания идентификаторов. Поэтому, как я могу обнаружить промежутки времени и назначить им новый идентификатор?

1 Ответ

0 голосов
/ 07 ноября 2018

Я считаю, что вам нужно 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...