在给定条件的 Pandas 数据框中查找最接近的日期

Finding the closest date inside a Pandas dataframe given a condition

我有这个标普500历史数据样本,我想比较他里面的日期。

>> 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 方法有时不起作用, 它可以生成一个不在我的索引中的日期。

此方法仅在您的索引列 ('Date') 包含 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)

为了获得与您的 DataFrame 中实际存在的计算日期最接近的日期,我们计算您的 DataFrame 中所有日期与计算日期之间的时间增量。从那里,我们选择了最小值以获得最近的日期。我们获取 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]