我正在尝试定义在不同会话中使用的应用程序。基本上,我将每5分钟定义为一个会话,并想知道数据集中有多少个移动会话。此外,我想知道在每个会话中启动了哪些应用程序。 我的数据框中的所有行都带有时间戳。 以下是数据集中的示例:
timestamp App
6773 2018-04-08 09:47:57.849 Chrome
6774 2018-04-08 09:48:17.573 YouTube
6775 2018-04-08 09:48:28.538 Instagram
6776 2018-04-08 09:48:37.381 Maps
6777 2018-04-08 09:48:46.680 Netflix
6778 2018-04-08 09:48:56.672 Google Play Store
6779 2018-04-08 09:56:58.880 Google
6780 2018-04-08 09:57:25.461 DB Navigator
6781 2018-04-08 11:28:38.762 Google
6782 2018-04-08 12:58:31.455 Google
6783 2018-04-08 14:31:18.131 Google
6784 2018-04-08 14:31:29.209 Google
6785 2018-04-08 14:58:42.875 Google
6786 2018-04-08 18:18:04.757 Chrome
6787 2018-04-08 21:08:41.368 Google
6788 2018-04-11 10:53:10.744 Google
6789 2018-04-14 19:54:37.441 Google
6790 2018-04-14 19:54:59.833 Google
6791 2018-04-14 19:55:10.844 YouTube
6792 2018-04-14 19:55:34.486 Google
6793 2018-04-14 20:23:00.315 Google
6794 2018-04-15 08:23:44.873 Google
6795 2018-04-15 08:24:07.257 Google
这是所需的输出,其中添加了一个名为SessionID的新列,用于定义当前会话的ID。
timestamp App SessionID
6773 2018-04-08 09:47:57.849 Chrome 1
6774 2018-04-08 09:48:17.573 YouTube 1
6775 2018-04-08 09:48:28.538 Instagram 1
6776 2018-04-08 09:48:37.381 Maps 1
6777 2018-04-08 09:48:46.680 Netflix 1
6778 2018-04-08 09:48:56.672 Google Play Store 1
6779 2018-04-08 09:56:58.880 Google 2
6780 2018-04-08 09:57:25.461 DB Navigator 2
6781 2018-04-08 11:28:38.762 Google 3
6782 2018-04-08 12:58:31.455 Google 4
6783 2018-04-08 14:31:18.131 Google 5
6784 2018-04-08 14:31:29.209 Google 5
6785 2018-04-08 14:58:42.875 Google 6
6786 2018-04-08 18:18:04.757 Chrome 7
6787 2018-04-08 21:08:41.368 Google 8
6788 2018-04-11 10:53:10.744 Google 9
6789 2018-04-14 19:54:37.441 Google 10
6790 2018-04-14 19:54:59.833 Google 10
6791 2018-04-14 19:55:10.844 YouTube 10
6792 2018-04-14 19:55:34.486 Google 10
6793 2018-04-14 20:23:00.315 Google 11
6794 2018-04-15 08:23:44.873 Google 12
6795 2018-04-15 08:24:07.257 Google 12
答案 0 :(得分:2)
您可以舍入到最近的5分钟,然后使用factorize
fivemin=5*60*1000000000
s=pd.to_datetime(((df.timestamp.astype(np.int64) // fivemin + 1 ) * fivemin))
df['new']=pd.factorize(s.astype(str))[0]+1
df
Out[66]:
App timestamp new
6773 Chrome 2018-04-08 09:47:57.849 1
6774 YouTube 2018-04-08 09:48:17.573 1
6775 Instagram 2018-04-08 09:48:28.538 1
6776 Maps 2018-04-08 09:48:37.381 1
6777 Netflix 2018-04-08 09:48:46.680 1
6778 Google Play Store 2018-04-08 09:48:56.672 1
6779 Google 2018-04-08 09:56:58.880 2
6780 DB Navigator 2018-04-08 09:57:25.461 2
6781 Google 2018-04-08 11:28:38.762 3
6782 Google 2018-04-08 12:58:31.455 4
6783 Google 2018-04-08 14:31:18.131 5
6784 Google 2018-04-08 14:31:29.209 5
6785 Google 2018-04-08 14:58:42.875 6
6786 Chrome 2018-04-08 18:18:04.757 7
6787 Google 2018-04-08 21:08:41.368 8
6788 Google 2018-04-11 10:53:10.744 9
6789 Google 2018-04-14 19:54:37.441 10
6790 Google 2018-04-14 19:54:59.833 10
6791 YouTube 2018-04-14 19:55:10.844 11
6792 Google 2018-04-14 19:55:34.486 11
6793 Google 2018-04-14 20:23:00.315 12
6794 Google 2018-04-15 08:23:44.873 13
6795 Google 2018-04-15 08:24:07.257 13
答案 1 :(得分:2)
以下是使用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)
将datetime对象转换为纳秒。然后我们用(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
答案 2 :(得分:2)
@ Win,@ Anton vBR,如果我错了,请更正我,但看起来你的解决方案针对6791 6792返回了与OP发布的所需输出不同的bin。我试过这种方式,它得到了正确的两个:
start_t=df["Timestamp"].iloc[0]
df["ID"]=pd.factorize(df["Timestamp"].apply(lambda x: int((x-start_t).total_seconds()/60) // 5 ))[0]+1
输出:
App Timestamp ID
6773 Chrome 2018-04-08 09:47:57.849 1
6774 YouTube 2018-04-08 09:48:17.573 1
6775 Instagram 2018-04-08 09:48:28.538 1
6776 Maps 2018-04-08 09:48:37.381 1
6777 Netflix 2018-04-08 09:48:46.680 1
6778 Google Play Store 2018-04-08 09:48:56.672 1
6779 Google 2018-04-08 09:56:58.880 2
6780 DB Navigator 2018-04-08 09:57:25.461 2
6781 Google 2018-04-08 11:28:38.762 3
6782 Google 2018-04-08 12:58:31.455 4
6783 Google 2018-04-08 14:31:18.131 5
6784 Google 2018-04-08 14:31:29.209 5
6785 Google 2018-04-08 14:58:42.875 6
6786 Chrome 2018-04-08 18:18:04.757 7
6787 Google 2018-04-08 21:08:41.368 8
6788 Google 2018-04-11 10:53:10.744 9
6789 Google 2018-04-14 19:54:37.441 10
6790 Google 2018-04-14 19:54:59.833 10
6791 YouTube 2018-04-14 19:55:10.844 10
6792 Google 2018-04-14 19:55:34.486 10
6793 Google 2018-04-14 20:23:00.315 11
6794 Google 2018-04-15 08:23:44.873 12
6795 Google 2018-04-15 08:24:07.257 12