Прежде чем я задам вопрос, я желаю вам всем счастливого Нового года.
Я новичок в python и почти в любой вычислительной работе с использованием компьютеров. Подобный вопрос задавался раньше, но ответ, похоже, не работает сейчас, по крайней мере, для меня. У меня есть фрейм данных с атрибутами DateTime, open, high, low и close, записанными с интервалом в 1 минуту. Как преобразовать 1-минутный фрейм данных, скажем, в 30-минутный фрейм данных?
Выдержка из данных показана ниже
DateTime Open High Low Close
0 2017-01-02 02:00:00 1.05155 1.05197 1.05155 1.05190
1 2017-01-02 02:01:00 1.05209 1.05209 1.05177 1.05179
2 2017-01-02 02:02:00 1.05177 1.05198 1.05177 1.05178
3 2017-01-02 02:03:00 1.05188 1.05200 1.05188 1.05200
4 2017-01-02 02:04:00 1.05196 1.05204 1.05196 1.05203
тем временем желаемый результат что-то вроде
DateTime Open High Low Close
0 2017-01-02 02:00:00 1.05155 1.05197 1.05155 1.05190
1 2017-01-02 02:30:00 -the next 30 minutes-
2 2017-01-02 03:00:00
3 2017-01-02 03:30:00
4 2017-01-02 04:00:00
next day
2017-01-03 00:00:00
Более поздние 30-минутные интервалы можно объединить следующим образом; Open – первая цена на таймфрейме, high — самая высокая цена на 30-минутном таймфрейме, low — самая низкая цена на 30-минутном таймфрейме, close — последняя цена перед новым таймфреймом.
Я попытался сделать это в Microsoft Excel, используя следующую формулу;
=INT(A3) + TIME(HOUR(A3), MINUTE(A3)+30 ; 0), потому что в ячейке A2 было DateTime 2017-01-02 02:00:00, поэтому ячейка A3 произвела 2017-01-02 02: 30:00 но когда я все это перетаскиваю, то не учитывает переход на новый день, только время продолжает меняться правильно. Кроме того, я не смог найти формулу, которую можно было бы использовать для агрегирования атрибутов так, как я описал выше.
Мы будем очень признательны за выполнение этого в Microsoft Excel или Python.






В Pandas для этого есть очень удобная функция: pd.DataFrame.resample , но убедитесь, что ваш столбец «DateTime» на самом деле имеет формат даты и времени, а не просто строку (вам может понадобиться использовать pd.to_datetime для сделать это, если вы еще этого не сделали).
Функции агрегации можно найти здесь: https://pandas.pydata.org/docs/reference/resampling.html
Окончательно:
import pandas as pd
df = pd.read_clipboard() # Your dataframe here
agg_funcs = {
"Open": "first",
"High": "max",
"Low": "min",
"Close": "last"
}
out = df.resample("30T", on = "DateTime").agg(agg_funcs)
Действительные псевдонимы частот (и кратные им) можно найти здесь: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
PS: вам не нужно использовать аргумент ключевого слова on = "DateTime", если вы сделаете столбец «DateTime» индексом (т. е. pd.DatetimeIndex), что очень удобно (и также кажется естественным для ваших данных) другие задачи, которые вы, возможно, захотите сделать.