Pandas DatetimeIndex:频率字符串中的周期数?
Pandas DatetimeIndex: Number of periods in a frequency string?
如何使用频率字符串(偏移量别名)计算 Pandas DatetimeIndex 中的周期数?例如,假设我有以下 DatetimeIndex:
idx = pd.date_range("2019-03-01", periods=10000, freq='5T')
我想知道一周有多少个 5 分钟时段,或“7D”。我可以计算这个 "manually":
periods = (7*24*60)//5
或者我可以获得虚拟索引的长度:
len(pd.timedelta_range(start='1 day', end='8 days', freq='5T'))
这两种方法似乎都不太有效。使用 Pandas 日期功能有更好的方法吗?
尝试使用 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)
我终于想出了一个合理的解决方案:
pd.to_timedelta('7D')//idx.freq
这样做的好处是我可以使用频率字符串(偏移量别名)指定一个范围,并且可以从数据帧中推断出周期或频率。 @Terry 建议的 numpy 解决方案仍然是速度很重要的最快解决方案。
如何使用频率字符串(偏移量别名)计算 Pandas DatetimeIndex 中的周期数?例如,假设我有以下 DatetimeIndex:
idx = pd.date_range("2019-03-01", periods=10000, freq='5T')
我想知道一周有多少个 5 分钟时段,或“7D”。我可以计算这个 "manually":
periods = (7*24*60)//5
或者我可以获得虚拟索引的长度:
len(pd.timedelta_range(start='1 day', end='8 days', freq='5T'))
这两种方法似乎都不太有效。使用 Pandas 日期功能有更好的方法吗?
尝试使用 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)
我终于想出了一个合理的解决方案:
pd.to_timedelta('7D')//idx.freq
这样做的好处是我可以使用频率字符串(偏移量别名)指定一个范围,并且可以从数据帧中推断出周期或频率。 @Terry 建议的 numpy 解决方案仍然是速度很重要的最快解决方案。