首页 > 解决方案 > 给定条件在 Pandas 数据框中查找最近的日期

问题描述

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

标签: pythonpandasdatetimedatetime-format

解决方案


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

推荐阅读