Панды 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 ответа
Попробуйте использовать numpy
len(np.arange(pd.Timedelta('1 days'), pd.Timedelta('8 days'), timedelta(minutes=5)))
out:
2016
Мое тестирование, первый импорт time
:
import time
ОП решение:
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
Преимущество этого заключается в том, что я могу указать диапазон, используя строку частоты (псевдоним смещения), а период или частота выводятся из кадра данных. NumPy решение, предложенное @Terry, по-прежнему является самым быстрым решением, где важна скорость.