我的问题是我想过滤一个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')
那么,总结一下,是否有更快的方法按时间过滤多天?
THX
答案 0 :(得分: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日完成了这些测试作为索引。
Definition: df.between_time(self, start_time, end_time, include_start=True, include_end=True) Docstring: Select values between particular times of the day (e.g., 9:00-9:30 AM) Parameters ---------- start_time : datetime.time or string end_time : datetime.time or string include_start : boolean, default True include_end : boolean, default True Returns ------- values_between_time : type of caller