首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得用于用户会话的Pandas TimeSeries (使用Pandas或Numpy)

问如何获得用于用户会话的Pandas TimeSeries (使用Pandas或Numpy)
EN

Stack Overflow用户
提问于 2014-04-17 05:41:01
回答 3查看 1.3K关注 0票数 2

我有一些数据,其中有一系列用户的登录和注销时间。

输入:

代码语言:javascript
复制
        Login        Logout
User_1  10:25AM      6:01PM
User_2  8:58AM       5:12PM
User_3  9:23AM       1:35PM
User_3  3:10PM       4:49PM

我希望能够找到在一段时间内登录的用户数量(例如,每小时)。

我希望能够将此与我在Pandas中拥有的相同时期的其他数据相关联,例如,在此期间发生的"Foo“事件的数量。

期望产出:

代码语言:javascript
复制
          Num Logged In   Foo Event Count
9:00AM                1                11
10:00AM               2                17
11:00AM               3                28
12:00PM               3                26
1:00PM                3                22
2:00PM                2                15
3:00PM                2                15
4:00PM                3                22
5:00PM                2                13

在最简单的情况下,我可以得到在上午10:00登录的用户数量,这将是一个有用的开始。如果我在查看数据到日周期的重新采样,那么我需要更聪明一些,看看最大的同时登录,或者9:00到5:00 of之间的平均同时登录数。

显然,我可以编写简单的Python,考虑到我在Pandas中重新采样的时间,它可以给我所需的系列,但是我想知道Pandas中是否有一个技巧可以帮助我,或者我可以在Numpy中做一些事情,因为我想将它应用于大型数据集(数百名用户,数千天,每天多次登录/退出)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-24 03:05:31

我发现了一种似乎很有效的方法:

假设我们可以将登录/注销数据转换为两个按时间索引的DataFrames:

代码语言:javascript
复制
Login    UserLogin
-------- ---------
8:58AM   User_2    
9:23AM   User_3    
10:25AM  User_1    
3:10PM   User_3    

Logout   UserLogout
-------- ----------
1:35PM   User_3
4:49PM   User_3
5:12PM   User_2
6:01PM   User_1

然后,我们可以为每个表添加一个额外的列:1用于登录,-1用于注销:

代码语言:javascript
复制
login['AvailabilityDelta'] = 1
logout['AvailabilityDelta'] = -1

然后,我们可以在这两个表上执行一个外部连接,并填充用0创建的连接的NA值:

代码语言:javascript
复制
events = login.join(logout, how='outer')
events.fillna(value=0, inplace=True)

然后,在新加入的"Events“DataFrame上,我们创建一个"AvailabilityDelta”列,它是" login“和" logout”列的总和(来自我们前面添加的登录和注销DataFrames +1s和-1s ):

代码语言:javascript
复制
events['AvailabilityDelta'] = events.Login + events.Logout

最后,我们可以通过对"AvailabilityDelta“列执行累积和来创建”可用性“列。这给出了我们在最初的问题中所追求的"Num登录“数据:

代码语言:javascript
复制
events['Availability'] = events.AvailabilityDelta.cumsum()

此时添加其他信息或创建TimeSeries数据非常简单,例如:

代码语言:javascript
复制
ts = events.resample('1H', how='mean', fill_method='ffill')
票数 2
EN

Stack Overflow用户

发布于 2014-04-17 09:55:43

看看箭头模块 --它提供了非常通用的具有高级方法的DateTime对象。

范围和跨度

获取任何单位的时差:

代码语言:javascript
复制
>>> arrow.utcnow().span('hour')
(<Arrow [2013-05-07T05:00:00+00:00]>, <Arrow [2013-05-07T05:59:59.999999+00:00]>)

或者拿地板和天花板:

代码语言:javascript
复制
>>> arrow.utcnow().floor('hour')
<Arrow [2013-05-07T05:00:00+00:00]>

>>> arrow.utcnow().ceil('hour')
<Arrow [2013-05-07T05:59:59.999999+00:00]>
票数 1
EN

Stack Overflow用户

发布于 2014-04-17 06:18:13

您最好的选择是使用类似strptime之类的工具来转换时间:

代码语言:javascript
复制
import time
t = time.strptime("5:24pm", "%H:%M%p")
>>> t.tm_hour
5
>>> t.tm_min
24

这样你就可以在同一时间内得到所有的东西,例如,你想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23125426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档