Поиск ближайшей даты внутри фрейма данных Pandas с учетом условия

>> df

                  High         Low        Open       Close       Volume   Adj Close
Date
2011-01-03  127.599998  125.699997  126.709999  127.050003  138725200.0  104.119293
2011-01-04  127.370003  126.190002  127.330002  126.980003  137409700.0  104.061905
2011-01-05  127.720001  126.459999  126.580002  127.639999  133975300.0  104.602806
2011-01-06  127.830002  127.010002  127.690002  127.389999  122519000.0  104.397934
2011-01-07  127.769997  126.150002  127.559998  127.139999  156034600.0  104.193031
...                ...         ...         ...         ...          ...         ...
2020-12-14  369.799988  364.470001  368.640015  364.660004   69216200.0  363.112183
2020-12-15  369.589996  365.920013  367.399994  369.589996   64071100.0  368.021240
2020-12-16  371.160004  368.869995  369.820007  370.170013   58420500.0  368.598816
2020-12-17  372.459991  371.049988  371.940002  372.239990   64119500.0  370.660004
2020-12-18  371.149994  367.019989  370.970001  369.179993  135359900.0  369.179993

Пусть latest будет самыми последними ценами SnP OHLC


latest = df.iloc[-1]

Как я могу найти дату внутри этого индекса фрейма данных, ближайшую к latest с отставанием на 1 год (latest.replace(year=latest.year-1)? Простое использование метода pd.Timestamp.replace иногда не работает, он может генерировать дату, которой нет в моем индексе.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 289
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот подход работает только в том случае, если ваш столбец индекса («Дата») содержит объекты DateTime. Если он содержит строки, вам сначала нужно преобразовать индекс в формат DateTime.

df.index = pd.to_datetime(df.index)

При этом вы можете узнать самое последнее время с помощью latest = df.index[-1] или df.index.max().

Затем мы смещаем последнюю дату на один год, используя pd.DateOffset, и получаем теоретическую запаздывающую дату.

lagged_theoretical = latest - pd.DateOffset(years=1)

Чтобы получить ближайшую дату к расчетной дате, которая фактически присутствует в вашем фрейме данных, мы вычисляем дельту времени между всеми датами в вашем фрейме данных и вычисленной датой. Оттуда мы выбрали минимум, чтобы получить ближайшую дату. Мы получаем индекс минимума в массиве timedelta и используем этот индекс для получения фактической даты из столбца индекса DataFrame. Вот весь код:

latest = df.index[-1]
lagged_theoretical = latest - pd.DateOffset(years=1)
td = (abs(df.index - lagged_theoretical)).values
idx = np.where(td == td.min())[0][0]
lagged_actual = df.index[idx]

Так много для примера тезиса, ваше решение работает, но прошлой ночью я смог разработать новое решение, используя метод pd.DataFrame.index.get_loc(dt, metho='nearest') .

Occhima 21.12.2020 14:25

Отличное решение, Окхима. Только одно исправление: это method (не мето)

ASB 15.10.2022 16:48

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