如何使用频率字符串(偏移别名)来获取Pandas DatetimeIndex中的周期数?例如,假设我具有以下DatetimeIndex:
idx = pd.date_range("2019-03-01", periods=10000, freq='5T')
我想知道一周中有5分钟,或称为“ 7D”。我可以“手动”计算:
periods = (7*24*60)//5
或者我可以得到一个虚拟索引的长度:
len(pd.timedelta_range(start='1 day', end='8 days', freq='5T'))
这两种方法似乎都不是很有效。使用Pandas日期功能是否有更好的方法?
答案 0 :(得分:1)
尝试使用numpy
len(np.arange(pd.Timedelta('1 days'), pd.Timedelta('8 days'), timedelta(minutes=5)))
out:
2016
我的测试,首先导入time
:
import time
OP解决方案:
start_time = time.time()
len(pd.timedelta_range(start='1 day', end='8 days', freq='5T'))
print((time.time() - start_time))
out:
0.0011057853698730469]
使用numpy
start_time = time.time()
len(np.arange(pd.Timedelta('1 day'), pd.Timedelta('8 days'), timedelta(minutes=5)))
print((time.time() - start_time))
out:
0.0001723766326904297
遵循@meW的建议,使用timeit进行性能测试
使用timedelta_range
:
%timeit len(pd.timedelta_range(start='1 day', end='8 days', freq='5T'))
out:
91.1 µs ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
使用numpy:
%timeit len(np.arange(pd.Timedelta('1 day'), pd.Timedelta('8 days'), timedelta(minutes=5)))
out:
16.3 µs ± 196 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
答案 1 :(得分:0)
我终于找到了一个合理的解决方案:
pd.to_timedelta('7D')//idx.freq
这样的好处是我可以使用频率字符串(偏移别名)指定范围,并且可以从数据帧中推断出周期或频率。 @Terry建议的numpy解决方案仍然是速度至关重要的最快解决方案。