You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:20:30