使用yfinance与pandas获取股价时遇single positional indexer越界错误
解决方案:跳过无数据股票避免索引越界错误
问题根源
报错single positional indexer is out-of-bounds出现在prev2 = dataPrev.tail().iloc[2],说明以下两种情况之一:
- yfinance未获取到对应股票的历史数据(
data2为空) - 获取到的数据行数不足3行,无法通过
iloc[2]访问第3个元素(从0开始计数)
原有代码未提前校验数据有效性,直接访问索引导致报错。
修复后的代码
def checkPriceAction(): global toStr for x in ticks: toStr = str(x) syb = yf.Ticker(toStr) # 获取数据 data = pd.DataFrame(syb.history(interval="1m", period='1d')) data2 = pd.DataFrame(syb.history(interval="1m", period='1d', end=pastTime, start=pastTime2)) # 校验data和data2是否有数据,且Open列存在 if data.empty or 'Open' not in data.columns: print(f"{toStr}: 未获取到当前时段数据,跳过") continue if data2.empty or 'Open' not in data2.columns: print(f"{toStr}: 未获取到历史时段数据,跳过") continue data1 = data['Open'].reset_index(drop=True) dataPrev = data2['Open'].reset_index(drop=True) # 校验数据长度是否足够访问iloc[2] if len(data1) < 3 or len(dataPrev) < 3: print(f"{toStr}: 数据行数不足,跳过") continue prev1 = data1.tail().iloc[2] prev2 = dataPrev.tail().iloc[2] # 修正逻辑判断:判断prev1或prev2是否为0 if prev1 == 0 or prev2 == 0: continue if prev2 > prev1: print(toStr, prev1, " : ", prev2 ) print(toStr, 'Watch stop', aware) else: print(toStr, 'Proceed to buy with robinhood', aware)
关键修改点
- 数据空值校验:处理数据前先检查
data和data2是否为空、Open列是否存在,避免后续索引访问报错 - 长度校验:确保
data1和dataPrev行数至少有3行,才能安全使用iloc[2] - 逻辑修正:将
if prev2 or prev1 == 0改为if prev1 == 0 or prev2 == 0,修复原逻辑判断错误 - 跳过机制:校验不通过时用
continue直接进入下一个股票循环,避免执行后续报错代码
兜底方案(可选)
如果需要更稳妥的错误处理,可以加入try-except块捕获异常:
def checkPriceAction(): global toStr for x in ticks: try: toStr = str(x) syb = yf.Ticker(toStr) data = pd.DataFrame(syb.history(interval="1m",period='1d')) data2 = pd.DataFrame(syb.history(interval="1m",period='1d', end=pastTime, start=pastTime2)) data1 = data['Open'].reset_index(drop=True) dataPrev = data2['Open'].reset_index(drop=True) prev1 = data1.tail().iloc[2] prev2 = dataPrev.tail().iloc[2] if prev1 == 0 or prev2 == 0: continue if prev2 > prev1: print(toStr, prev1, " : ", prev2 ) print(toStr, 'Watch stop', aware) else: print(toStr, 'Proceed to buy with robinhood', aware) except IndexError: print(f"{toStr}: 数据索引越界,跳过") except Exception as e: print(f"{toStr}: 发生未知错误 {str(e)},跳过")
内容的提问来源于stack exchange,提问作者Aaron Chris
相关产品推荐
相关产品推荐

