问题描述
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)]