在熊猫DataFrame /系列中快速选择时间间隔

发布于 2021-01-29 16:34:12

我的问题是我想过滤一个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')

因此,总而言之,有没有一种更快的方法可以在一天中的几天内进行过滤?

谢谢

关注者
0
被浏览
142
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要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(自我,开始时间,结束时间,include_start = True,include_end = True)
    Docstring:
    选择一天中特定时间之间的值(例如9:00-9:30 AM)
    
    参量
    ----------
    start_time:datetime.time或字符串
    end_time:datetime.time或字符串
    include_start:布尔值,默认为True
    include_end:布尔值,默认为True
    
    退货
    -------
    values_between_time:呼叫者的类型
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看