我对 panadas 很陌生,在 pandas 中有一个 DataFrame,看起来像这样:
customer_id, timestamp
74594, 1, 2016-05-25 15:39:41
74556, 1, 2016-05-25 15:40:33
74403, 1, 2016-05-25 15:43:26
73783, 1, 2016-05-25 15:52:40
73241, 1, 2016-05-25 16:01:01
71960, 1, 2016-05-25 16:19:35
71590, 1, 2016-05-25 16:26:05
11765, 2, 2016-05-26 18:03:18
81825, 3, 2016-05-25 13:14:55
81560, 3, 2016-05-25 13:22:15
80517, 3, 2016-05-25 13:27:36
78370, 3, 2016-05-25 13:30:58
75575, 3, 2016-05-25 15:22:00
74890, 3, 2016-05-25 15:33:56
74119, 3, 2016-05-25 15:47:57
我如何构建 session 数据,以便只要在 15 分钟内同一客户有另一个时间戳,那么它就是同一个 session ,但是如果超过 15 分钟已经过去或者有一个新客户,那么一个新 session 是创建?
customer_id, timestamp, session_id
74594, 1, 2016-05-25 15:39:41, A
74556, 1, 2016-05-25 15:40:33, A
74403, 1, 2016-05-25 15:43:26, A
73783, 1, 2016-05-25 15:52:40, A
73241, 1, 2016-05-25 16:01:01, A
71960, 1, 2016-05-25 16:19:35, B <---- new session - more than 15 minutes elapsed
71590, 1, 2016-05-25 16:26:05, B
11765, 2, 2016-05-26 18:03:18, C <---- new session - different customer
81825, 3, 2016-05-25 13:14:55, D <---- new session - different customer
81560, 3, 2016-05-25 13:22:15, D
80517, 3, 2016-05-25 13:27:36, D
78370, 3, 2016-05-25 13:30:58, D
75575, 3, 2016-05-25 15:22:00, E <---- new session - more than 15 minutes elapsed
74890, 3, 2016-05-25 15:33:56, E
74119, 3, 2016-05-25 15:47:57, E
请您参考如下方法:
设置
import pandas as pd
from string import ascii_uppercase
text = """index,customer_id,timestamp
74594,1,2016-05-25 15:39:41
74556,1,2016-05-25 15:40:33
74403,1,2016-05-25 15:43:26
73783,1,2016-05-25 15:52:40
73241,1,2016-05-25 16:01:01
71960,1,2016-05-25 16:19:35
71590,1,2016-05-25 16:26:05
11765,2,2016-05-25 18:03:18
81825,3,2016-05-25 13:14:55
81560,3,2016-05-25 13:22:15
80517,3,2016-05-25 13:27:36
78370,3,2016-05-25 13:30:58
75575,3,2016-05-25 15:22:00
74890,3,2016-05-25 15:33:56
74119,3,2016-05-25 15:47:57"""
df = pd.read_csv(StringIO(text))
df.timestamp = pd.to_datetime(df.timestamp)
print df
index customer_id timestamp
0 74594 1 2016-05-25 15:39:41
1 74556 1 2016-05-25 15:40:33
2 74403 1 2016-05-25 15:43:26
3 73783 1 2016-05-25 15:52:40
4 73241 1 2016-05-25 16:01:01
5 71960 1 2016-05-25 16:19:35
6 71590 1 2016-05-25 16:26:05
7 11765 2 2016-05-25 18:03:18
8 81825 3 2016-05-25 13:14:55
9 81560 3 2016-05-25 13:22:15
10 80517 3 2016-05-25 13:27:36
11 78370 3 2016-05-25 13:30:58
12 75575 3 2016-05-25 15:22:00
13 74890 3 2016-05-25 15:33:56
14 74119 3 2016-05-25 15:47:57
构建 bool 系列以识别时间间隔何时大于 15 分钟,以及何时获得新的 customer_id。
gt_15min = df.timestamp.diff() > pd.datetools.timedelta(minutes=15)
diff_user = df.customer_id.diff() > 0
# or
diff_user = df.customer_id != df.customer_id.shift()
session_id = (diff_user | gt_15min).cumsum()
df['session_id'] = session_id.map(pd.Series(list(ascii_uppercase)))
print df
index customer_id timestamp session_id
0 74594 1 2016-05-25 15:39:41 A
1 74556 1 2016-05-25 15:40:33 A
2 74403 1 2016-05-25 15:43:26 A
3 73783 1 2016-05-25 15:52:40 A
4 73241 1 2016-05-25 16:01:01 A
5 71960 1 2016-05-25 16:19:35 B
6 71590 1 2016-05-25 16:26:05 B
7 11765 2 2016-05-25 18:03:18 C
8 81825 3 2016-05-25 13:14:55 D
9 81560 3 2016-05-25 13:22:15 D
10 80517 3 2016-05-25 13:27:36 D
11 78370 3 2016-05-25 13:30:58 D
12 75575 3 2016-05-25 15:22:00 E
13 74890 3 2016-05-25 15:33:56 E
14 74119 3 2016-05-25 15:47:57 E
