在pandas DataFrame/Series中快速选择时间间隔

5
我的问题是,我想将DataFrame过滤,只包括在时间间隔[start,end)内的时间。如果不关心日期,我想仅为每天的开始和结束时间进行过滤。我有一个解决方案,但它很慢。所以我的问题是,是否有更快的方法来进行基于时间的过滤。
示例:
import pandas as pd
import time


index=pd.date_range(start='2012-11-05 01:00:00', end='2012-11-05 23:00:00', freq='1S').tz_localize('UTC')
df=pd.DataFrame(range(len(index)), index=index, columns=['Number'])

# select from 1 to 2 am, include day
now=time.time()
df2=df.ix['2012-11-05 01:00:00':'2012-11-05 02:00:00']
print 'Took %s seconds' %(time.time()-now) #0.0368609428406

# select from 1 to 2 am, for every day
now=time.time()
selector=(df.index.hour>=1) & (df.index.hour<2)
df3=df[selector]
print 'Took %s seconds' %(time.time()-now) #Took  0.0699911117554

可以看到,如果我移除日期(第二种情况),计算时间需要近两倍。如果我有多个不同的日期,例如从11月5日到7日,则计算时间会迅速增加:

index=pd.date_range(start='2012-11-05 01:00:00', end='2012-11-07 23:00:00', freq='1S').tz_localize('UTC')

所以,总结一下,在许多天内按照一天中的时间进行过滤有更快的方法吗?
谢谢。
1个回答

6
你需要使用between_time方法。
In [14]: %timeit df.between_time(start_time='01:00', end_time='02:00')
100 loops, best of 3: 10.2 ms per loop

In [15]: %timeit selector=(df.index.hour>=1) & (df.index.hour<2); df[selector]
100 loops, best of 3: 18.2 ms per loop

我已经将这些测试的日期设置为11月5日至7日。

文档

定义:df.between_time(self, start_time, end_time, include_start=True, include_end=True)
文档字符串:
选择一天中特定时间段(例如,上午9:00-9:30)之间的值。
参数 ---------- start_time:datetime.time或字符串 end_time:datetime.time或字符串 include_start:布尔型,默认为True include_end:布尔型,默认为True 返回 ------- values_between_time:调用者类型

你是否愿意提交一个 PR,为 timeseries.rst 添加一个小节,以说明如何使用此功能? - Jeff
顺便问一下,是否有类似的方法可以选择一段时间间隔,例如属于指定日期集合的所有时间?我当然可以通过index=(df.index.date==a_date)进行过滤,但这样做会非常慢...谢谢! - Mannaggia
@Jeff:目前有点忙,无法很快提交PR。同时,我正在使用0.12版本的项目上工作;因此,在确保升级后一切正常之前,需要一些时间才能进入开发。你对上面的评论有什么回答吗?例如between_date这样的东西? - Nipun Batra
好的,将pd.Timestamp设置为与数据框df相同的时区,它可以正常工作。然而,查询方法,即df.query("index>=timestamp"),比df.idx[timestamp:]或df[timestamp:]慢大约4倍,其中timestamp=pd.Timestamp('2012-11-7').tz_localize('Europe/Berlin')。 - Mannaggia
时区是在Python中使所有内容评估回来的成本;如果系列足够大,则处理UTC会更划算。 - Jeff
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接