如何按小时快速过滤pandas DatetimeIndex
How to quickly filter pandas DatetimeIndex by hour
例如,我有一个 pandas 系列作为
rng=pd.date_range('2020-12-20',periods=1000000,freq='H')
s=pd.Series(np.random.randn(len(rng)), index=rng)
很简单 select 所有行都属于 2021 年
%timeit -n1 s['2021']
速度超快,每个循环仅需 407 µs ± 193 µs
现在,如果我想 select 1 点钟的所有行。我能想到的唯一方法是
%timeit -n1 s[s.index.hour==1]
慢得多,每个循环需要 28.9 毫秒 ± 1.06 毫秒
我认为必须有更好的方法来解决这个问题。因为如果我们使用相同的方法获取属于 2021 年的行,那就是
%timeit -n1 s[s.index.year==2021]
也需要 28.9 毫秒。
那么按小时、分钟甚至秒 select 行的更好方法是什么?
试试 between_time
s.between_time('01:00:00','02:00:00',include_end=False)
您可以尝试通过 at_time()
:
s.at_time('01:00:00')
或
import datetime
s[datetime.time(1)]
#OR
s[datetime.time(1,0,0)]
例如,我有一个 pandas 系列作为
rng=pd.date_range('2020-12-20',periods=1000000,freq='H')
s=pd.Series(np.random.randn(len(rng)), index=rng)
很简单 select 所有行都属于 2021 年
%timeit -n1 s['2021']
速度超快,每个循环仅需 407 µs ± 193 µs
现在,如果我想 select 1 点钟的所有行。我能想到的唯一方法是
%timeit -n1 s[s.index.hour==1]
慢得多,每个循环需要 28.9 毫秒 ± 1.06 毫秒
我认为必须有更好的方法来解决这个问题。因为如果我们使用相同的方法获取属于 2021 年的行,那就是
%timeit -n1 s[s.index.year==2021]
也需要 28.9 毫秒。
那么按小时、分钟甚至秒 select 行的更好方法是什么?
试试 between_time
s.between_time('01:00:00','02:00:00',include_end=False)
您可以尝试通过 at_time()
:
s.at_time('01:00:00')
或
import datetime
s[datetime.time(1)]
#OR
s[datetime.time(1,0,0)]