Вот компактная версия с использованием np.unique
min5 = df['timestamp'].astype(np.int64)//(10**9*5*60)
df['SessionID'] = np.unique(min5, return_inverse=True)[1]+1
Как приятно заметил @ Dav2357, ваша группа 10 включает 55. что-то. Я предполагаю, что это ошибка, но ее можно исправить, удалив первое значение (если это ваша база):
s = df['timestamp'].astype(np.int64)
df['SessionID'] = np.unique((s-s[0])//(10**9*5*60), return_inverse=True)[1]+1
Объяснение: мы используем тот факт, что мы можем преобразовать объекты даты и времени в наносекунды с .astype(np.int64)
. Затем мы делим на (10**9**5*60)
, чтобы получить делитель.
Делитель - это значение, равное значениям в одном и том же 5-минутном интервале.
import pandas as pd
import numpy as np
data = '''\
2018-04-08T09:47:57.849,Chrome
2018-04-08T09:48:17.573,YouTube
2018-04-08T09:48:28.538,Instagram
2018-04-08T09:48:37.381,Maps
2018-04-08T09:48:46.680,Netflix
2018-04-08T09:48:56.672,Google Play Store
2018-04-08T09:56:58.880,Google
2018-04-08T09:57:25.461,DB Navigator
2018-04-08T11:28:38.762,Google
2018-04-08T12:58:31.455,Google
2018-04-08T14:31:18.131,Google
2018-04-08T14:31:29.209,Google
2018-04-08T14:58:42.875,Google
2018-04-08T18:18:04.757,Chrome
2018-04-08T21:08:41.368,Google
2018-04-11T10:53:10.744,Google
2018-04-14T19:54:37.441,Google
2018-04-14T19:54:59.833,Google
2018-04-14T19:55:10.844,YouTube
2018-04-14T19:55:34.486,Google
2018-04-14T20:23:00.315,Google
2018-04-15T08:23:44.873,Google
2018-04-15T08:24:07.257,Google'''
df = pd.read_csv(pd.compat.StringIO(data), names=['timestamp','App'], parse_dates=[0])
s = df['timestamp'].astype(np.int64)
df['SessionID'] = np.unique((s-s[0])//(10**9*5*60), return_inverse=True)[1]+1
print(df)
Возвращает:
timestamp App SessionID
0 2018-04-08 09:47:57.849 Chrome 1
1 2018-04-08 09:48:17.573 YouTube 1
2 2018-04-08 09:48:28.538 Instagram 1
3 2018-04-08 09:48:37.381 Maps 1
4 2018-04-08 09:48:46.680 Netflix 1
5 2018-04-08 09:48:56.672 Google Play Store 1
6 2018-04-08 09:56:58.880 Google 2
7 2018-04-08 09:57:25.461 DB Navigator 2
8 2018-04-08 11:28:38.762 Google 3
9 2018-04-08 12:58:31.455 Google 4
10 2018-04-08 14:31:18.131 Google 5
11 2018-04-08 14:31:29.209 Google 5
12 2018-04-08 14:58:42.875 Google 6
13 2018-04-08 18:18:04.757 Chrome 7
14 2018-04-08 21:08:41.368 Google 8
15 2018-04-11 10:53:10.744 Google 9
16 2018-04-14 19:54:37.441 Google 10
17 2018-04-14 19:54:59.833 Google 10
18 2018-04-14 19:55:10.844 YouTube 10
19 2018-04-14 19:55:34.486 Google 10
20 2018-04-14 20:23:00.315 Google 11
21 2018-04-15 08:23:44.873 Google 12
22 2018-04-15 08:24:07.257 Google 12
Timecomparison:
1000 loops, best of 3: 962 µs per loop <-- Anton-vBR
1000 loops, best of 3: 1.34 ms per loop <-- Dav2357
1000 loops, best of 3: 1.43 ms per loop <-- Wen