>> 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 иногда не работает, он может генерировать дату, которой нет в моем индексе.
Этот подход работает только в том случае, если ваш столбец индекса («Дата») содержит объекты 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]
Отличное решение, Окхима. Только одно исправление: это method (не мето)
Так много для примера тезиса, ваше решение работает, но прошлой ночью я смог разработать новое решение, используя метод pd.DataFrame.index.get_loc(dt, metho='nearest') .