在给定条件的情况下,在 Pandas 数据框中查找最近的日期

问题描述

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

fname = input("Input your First Name : ")
lname = input("Input your Last Name : ")
print ("Hello  " + lname + " " + fname)

input("Want to play Mad Libs?")
if "yes":
    print("Great!") 
else:
    print("Ok,later!")

>> 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 为最新的 SnP OHLC 价格

latest

我如何在此数据帧索引中找到最接近滞后 1 年的 latest = df.iloc[-1] 的日期(latest?仅使用 latest.replace(year=latest.year-1) 方法有时不起作用,它可以生成不在我索引中的日期。

欢迎任何帮助。

解决方法

此方法仅适用于索引列 ('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]