我有一些数据,其中有一系列用户的登录和注销时间。
输入:
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“事件的数量。
期望产出:
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中做一些事情,因为我想将它应用于大型数据集(数百名用户,数千天,每天多次登录/退出)。
发布于 2014-04-24 03:05:31
我发现了一种似乎很有效的方法:
假设我们可以将登录/注销数据转换为两个按时间索引的DataFrames:
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用于注销:
login['AvailabilityDelta'] = 1
logout['AvailabilityDelta'] = -1然后,我们可以在这两个表上执行一个外部连接,并填充用0创建的连接的NA值:
events = login.join(logout, how='outer')
events.fillna(value=0, inplace=True)然后,在新加入的"Events“DataFrame上,我们创建一个"AvailabilityDelta”列,它是" login“和" logout”列的总和(来自我们前面添加的登录和注销DataFrames +1s和-1s ):
events['AvailabilityDelta'] = events.Login + events.Logout最后,我们可以通过对"AvailabilityDelta“列执行累积和来创建”可用性“列。这给出了我们在最初的问题中所追求的"Num登录“数据:
events['Availability'] = events.AvailabilityDelta.cumsum()此时添加其他信息或创建TimeSeries数据非常简单,例如:
ts = events.resample('1H', how='mean', fill_method='ffill')发布于 2014-04-17 09:55:43
看看箭头模块 --它提供了非常通用的具有高级方法的DateTime对象。
范围和跨度
获取任何单位的时差:
>>> arrow.utcnow().span('hour')
(<Arrow [2013-05-07T05:00:00+00:00]>, <Arrow [2013-05-07T05:59:59.999999+00:00]>)或者拿地板和天花板:
>>> 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]>发布于 2014-04-17 06:18:13
您最好的选择是使用类似strptime之类的工具来转换时间:
import time
t = time.strptime("5:24pm", "%H:%M%p")
>>> t.tm_hour
5
>>> t.tm_min
24这样你就可以在同一时间内得到所有的东西,例如,你想要的。
https://stackoverflow.com/questions/23125426
复制相似问题