Панды 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, по-прежнему является самым быстрым решением, где важна скорость.

Другие вопросы по тегам