Pandas DatetimeIndex:频率字符串中的周期数?

时间:2019-03-01 13:21:10

标签: python pandas time-series datetimeindex

如何使用频率字符串(偏移别名)来获取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日期功能是否有更好的方法?

2 个答案:

答案 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解决方案仍然是速度至关重要的最快解决方案。