Skip to main content
 首页 » 编程设计

python之session Pandas 的时间戳

2025年05月04日12lovecherry

我对 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