如何获取指定日期对应的前一日收盘价?
获取指定日期前一日收盘价的正确实现方法
问题背景
现有如下股票行情DataFrame:
timestamp open high low close volume 0 2023-01-03 3.5000 3.5972 3.3700 3.500 25231.0 1 2023-01-04 3.5000 3.5500 3.3000 3.505 40815.0 2 2023-01-05 3.5800 3.5800 3.4200 3.450 23833.0 3 2023-01-06 3.4500 3.5400 3.4300 3.500 12298.0 4 2023-01-09 3.5200 4.1500 3.4500 4.150 84826.0 5 2023-01-10 4.1800 4.1800 3.9000 4.010 26032.0 6 2023-01-11 4.1000 4.1000 3.9000 4.000 34807.0 7 2023-01-12 3.9900 4.4200 3.9500 4.190 39737.0 8 2023-01-13 4.4700 4.7500 4.3250 4.540 70672.0 9 2023-01-17 4.8100 5.4000 4.7100 4.780 213792.0 10 2023-01-18 4.6700 4.7475 4.3300 4.380 60063.0 11 2023-01-19 4.3400 4.6100 4.3400 4.420 29150.0 12 2023-01-20 4.3600 4.4400 4.3000 4.300 22088.0 13 2023-01-23 4.2500 4.3242 4.1118 4.150 25304.0 14 2023-01-24 4.2115 4.2499 4.1400 4.170 11240.0 15 2023-01-25 4.3050 4.5000 4.1700 4.220 35726.0 16 2023-01-26 4.2500 4.3000 3.8400 3.980 29257.0 17 2023-01-27 3.8800 4.0200 3.7400 3.770 47719.0 18 2023-01-30 3.7700 3.8700 3.4000 3.480 42704.0 19 2023-01-31 3.4000 3.6599 3.3100 3.570 275723.0 20 2023-02-01 3.4900 3.6500 3.4900 3.600 10763.0 21 2023-02-02 3.7500 3.7800 3.6300 3.750 51914.0 22 2023-02-03 3.7900 3.8899 3.6500 3.790 21763.0 23 2023-02-06 3.9000 4.0600 3.6500 3.700 37767.0 24 2023-02-07 3.7400 3.8500 3.5000 3.660 18919.0 25 2023-02-08 3.6900 3.6900 3.5500 3.610 7878.0 26 2023-02-09 3.6000 3.6000 3.5000 3.560 8594.0 27 2023-02-10 3.5000 3.5500 3.3102 3.420 34729.0 28 2023-02-13 3.4800 3.4800 3.1750 3.300 100681.0 29 2023-02-14 3.2800 3.3400 3.1300 3.180 76240.0 30 2023-02-15 3.2400 3.3000 3.1700 3.290 32600.0 31 2023-02-16 3.4400 3.8800 3.3000 3.880 133655.0 32 2023-02-17 3.9200 4.4300 3.9200 4.350 149117.0 33 2023-02-21 6.5300 7.6100 6.0600 6.400 40559286.0
已通过new_df = df.loc[df["timestamp"] == datetime.date(2023,2,21).strftime("%Y-%m-%d")]获取到2023-02-21的行数据,但尝试用new_df.shift(-1).close获取前一日收盘价失败,需正确实现方式。
错误原因
new_df是仅包含目标日期的单行DataFrame,调用shift(-1)会返回空值——因为单行数据没有"下一行",而我们需要的是原完整DataFrame中目标行的前一行数据,而非截取后的单行数据内的偏移。
正确实现方法
方法一:通过索引定位
先获取目标日期对应的行索引,直接取索引减1的close值:
import datetime import pandas as pd # 定义目标日期字符串 target_date_str = datetime.date(2023, 2, 21).strftime("%Y-%m-%d") # 获取目标行的索引(假设日期唯一) target_index = df[df["timestamp"] == target_date_str].index[0] # 获取前一日收盘价 previous_close = df.loc[target_index - 1, "close"]
方法二:将日期设为索引后使用shift
先把timetamp转为datetime类型并设置为索引,利用shift(1)偏移获取前一行数据:
# 转换timestamp列为datetime类型 df["timestamp"] = pd.to_datetime(df["timestamp"]) # 设置为索引 df.set_index("timestamp", inplace=True) # 获取目标日期的前一日收盘价 previous_close = df.shift(1).loc["2023-02-21", "close"]
方法三:直接查找前一个交易日的日期
由于股市存在休市(如周末),若需精准匹配前一个交易日而非日历前一天,可先计算前一个交易日的日期再查询:
from pandas.tseries.offsets import BDay # 计算前一个交易日的日期 prev_trading_day = datetime.date(2023, 2, 21) - BDay(1) prev_trading_day_str = prev_trading_day.strftime("%Y-%m-%d") # 查询该日期的收盘价 previous_close = df.loc[df["timestamp"] == prev_trading_day_str, "close"].values[0]
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

