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

Pandas DataFrame是否存在最大999行的存储容量限制?

问题根因说明

首先可以明确:Pandas DataFrame不存在999行的存储上限,普通家用PC环境下存储百万级行数据都是常规操作,你的报错和存储上限完全无关。

你遇到的KeyError:999是索引不匹配导致的,直接原因有两个:

  • 你的DataFrame实际长度不足:你构建DF时用了bars[:-1]截断了最后一根K线,假设你拉取的limit=amount_of_timeframe=1000,那最终DF的长度只有999,索引范围是0~998,当循环遍历到i=999时,就会触发索引不存在的错误
  • 你用「位置序号」直接访问Series的标签索引:如果后续你对DF做过过滤、删除行、未重置索引的操作,索引标签不会和行位置保持一一对应,也会触发这类KeyError。

修复方案

1. 修复遍历逻辑的索引错误

优先推荐你用Pandas内置函数替代手动循环遍历,性能更高也不会出索引错误:
如果你需要判断相邻两行的in_uptrend状态变化,直接用shift函数把上一行的值移到当前行即可:

# 新增一列存上一行的in_uptrend值
stdf['prev_in_uptrend'] = stdf['in_uptrend'].shift(1)
# 直接筛选符合条件的行
match_rows = stdf[(~stdf['prev_in_uptrend']) & (stdf['in_uptrend'])]

如果一定要用循环,用iloc按行位置取值,不要直接用方括号取标签:

# 先获取DF的实际长度,不要用amount_of_timeframe做遍历上限
df_length = len(stdf)
for i in range(1, df_length):
    prev_status = stdf['in_uptrend'].iloc[i-1]
    current_status = stdf['in_uptrend'].iloc[i]
    # 后续业务逻辑

2. 拉取超过1000根K线的实现方法

币安的OHLCV接口单次请求最多返回1000根K线,如果你需要更多历史数据,要分页拉取后拼接:

import time
import pandas as pd
import ccxt

exchange = ccxt.binance()
timeframe = '1m'
pair_to_trade = 'ETH/USDT'
# 总共要拉的K线数量
total_limit = 5000
# 单次最多拉1000根
limit_per_request = 1000
all_bars = []
# 从当前时间往前推的起始时间,根据你的时间单位调整毫秒数计算逻辑
since = exchange.milliseconds() - (total_limit * 60 * 1000)

while len(all_bars) < total_limit:
    bars = exchange.fetch_ohlcv(pair_to_trade, timeframe=timeframe, limit=limit_per_request, since=since)
    if not bars:
        break
    all_bars.extend(bars)
    # 更新since为最后一根K线的时间,下次从该时间点往后拉
    since = bars[-1][0] + 1
    # 避免触发接口频率限制
    time.sleep(exchange.rateLimit / 1000)

# 最终构建DF,不需要截断最后一根就不要写[:-1]
df = pd.DataFrame(all_bars[:total_limit], columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

内容的提问来源于stack exchange,提问作者chronovirus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:48:04