如何按小时快速过滤 Pandas DatetimeIndex

问题描述

例如,我有一个熊猫系列

rng=pd.date_range('2020-12-20',periods=1000000,freq='H')
s=pd.Series(np.random.randn(len(rng)),index=rng)

选择属于 2021 年的所有行很简单

%timeit -n1 s['2021']

速度非常快,每个循环仅需 407 µs ± 193 µs

现在,如果我想选择 1 点钟位置的所有行。我能想到的唯一方法

%timeit -n1 s[s.index.hour==1]

速度要慢得多,每个循环需要 28.9 ms ± 1.06 ms

我认为必须有更好的方法解决这个问题。因为如果我们使用相同的方法获取属于 2021 年的行,那就是

%timeit -n1 s[s.index.year==2021]

它也需要 28.9 毫秒。

那么按小时、分钟甚至秒选择行的更好方法是什么?

解决方法

试试 library(purrr) dt[,1] %>% bind_cols(dt %>% mutate(output = accumulate2(var1[-1],var1[-n()],.init = tibble(var2 = -3.12,var3 = 1),~ tibble(var2 = (..1$var2 + ..1$var3 - (..2/constant)),var3 = ..3 + 0.1 * ((..1$var2 + ..1$var3 - (..2/constant)) /constant)))) %>% select(output) %>% unnest(output)) var1 var2 var3 1: -92186.747 -3.120000e+00 1.00 2: -19163.504 -2.088501e+00 -92186.75 3: -18178.840 -9.218881e+04 -19163.52 4: -9844.679 -1.113523e+05 -18178.86 5: -16494.780 -1.295311e+05 -9844.70 6: -17088.058 -1.393758e+05 -16494.80

IF
,

您可以通过 at_time() 尝试:

s.at_time('01:00:00')

import datetime

s[datetime.time(1)]
#OR
s[datetime.time(1,0)]