У меня есть фрейм данных, который содержит цены для ценной бумаги каждую минуту в течение длительного периода времени.
Я хотел бы извлечь подмножество цен, 1 в день между определенными часами.
Вот пример грубого принуждения (для краткости используется ежечасно):
dates = pandas.date_range('20180101', '20180103', freq='H')
prices = pandas.DataFrame(index=dates,
data=numpy.random.rand(len(dates)),
columns=['price'])
Теперь у меня есть DateTimeIndex
для часов в каждом дне, которые я хочу извлечь:
start = datetime.datetime(2018,1,1,8)
end = datetime.datetime(2018,1,1,17)
day1 = pandas.date_range(start, end, freq='H')
start = datetime.datetime(2018,1,2,9)
end = datetime.datetime(2018,1,2,13)
day2 = pandas.date_range(start, end, freq='H')
days = [ day1, day2 ]
Затем я могу использовать prices.index.isin
с каждым из моих DateTimeIndexes
, чтобы извлечь цены соответствующего дня:
daily_prices = [ prices[prices.index.isin(d)] for d in days]
Это работает, как и ожидалось:
daily_prices[0]
![enter image description here](https://i.stack.imgur.com/MobO1.png)
daily_prices[1]
![enter image description here](https://i.stack.imgur.com/PtkC8.png)
Проблема заключается в том, что по мере увеличения длины каждого выделения DateTimeIndex
и количествадней, когда я хочу извлечь увеличения, мое понимание списка замедляется до ползания.
Поскольку я знаю, что каждый выбор DateTimeIndex
полностью включает в себя количество часов, которые он охватывает, я попытался использовать loc
, и первый ипоследний элемент каждого индекса в моем понимании списка:
daily_prices = [ prices.loc[d[0]:d[-1]] for d in days]
Хотя немного быстрее, он все ещеисключительно медленный, когда количество дней очень велико
Существует ли более эффективный способ разделения кадра данных на диапазоны времени начала и окончания, как указано выше?