首页 > 解决方案 > 如果时间戳的差异不超过 5 分钟,如何将时间戳的差异放入多个会话中?

问题描述

我有下面的数据框,我希望在数据框中创建一个名为“会话”的新列。如果用户花费超过 5 分钟(5*60 = 300 秒),则将创建新会话。每个用户从一个屏幕移动到另一个屏幕所花费的时间(经过的时间)在 Dataframe 的“delta”列中表示。 

最大会话不超过 5 分钟(300 秒)。

这是输入:

df = 

        ip             screen           timestamp  \

0   172.28.79.133   DiscoverStudents 2020-11-08 17:54:53 
1   172.28.79.133           Messages 2020-11-08 17:54:56   
2   172.28.79.133               Chat 2020-11-08 17:54:57    
3   172.28.79.133   DiscoverStudents 2020-11-10 20:36:32  
4   172.28.79.133   DiscoverStudents 2020-11-10 20:37:01  
5   172.28.79.133           Messages 2020-11-10 20:37:04   
6   172.28.79.133               Chat 2020-11-10 20:37:07   
7   172.28.79.133           Messages 2020-11-10 20:37:09 
8   172.28.79.133   DiscoverStudents 2020-11-10 20:37:16 
                          userId            delta  

0   0xSUpl8ge5SeLRvKHts8s7lEnlq2              NaT  
1   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:03  
2   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:01 
3   0xSUpl8ge5SeLRvKHts8s7lEnlq2  1 days 23:31:39  
4   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:29 
5   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:03 
6   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 11:00:03 
7   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:02 
8   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:07

添加会话列后,我希望上面的数据框是这样的:这是预期的输出(我正在寻找的输出):

         ip             screen           timestamp  \

0   172.28.79.133   DiscoverStudents 2020-11-08 17:54:53  
1   172.28.79.133           Messages 2020-11-08 17:54:56  
2   172.28.79.133               Chat 2020-11-08 17:54:57 
3   172.28.79.133   DiscoverStudents 2020-11-10 20:36:32   
4   172.28.79.133   DiscoverStudents 2020-11-10 20:37:01  
5   172.28.79.133           Messages 2020-11-10 20:37:04   
6   172.28.79.133               Chat 2020-11-10 20:37:07   
7   172.28.79.133           Messages 2020-11-10 20:37:09
8   172.28.79.133   DiscoverStudents 2020-11-10 20:37:16 
                          userId            delta       session 

0   0xSUpl8ge5SeLRvKHts8s7lEnlq2              NaT          NaT
1   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:03           1
2   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:01           1
3   0xSUpl8ge5SeLRvKHts8s7lEnlq2  1 days 23:31:39           1
4   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:29           2
5   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:03           2
6   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 11:00:03           2
7   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:02           3
8   0xSUpl8ge5SeLRvKHts8s7lEnlq2  0 days 00:00:07           3

这是代码:

df['timestamp'] = pd.to_datetime (df['timestamp']) 
df['delta'] = (df['timestamp']-df['timestamp'].shift())
df['time'] = df['delta'].dt.total_seconds()

for item in df['time']:
    if item <= 300:
       df['setion'] = 1
    else:
       df['setion'] = 2

请注意,根据每个用户从屏幕移动到另一个屏幕所用的时间,会话数可以超过 3 个会话(会话数不限)。

我真的需要你的帮助

标签: python-3.xdataframetimestamplogical-operators

解决方案


推荐阅读