🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant 聚宽 get_price 函数报错 KeyError: 'trade_time' 的原因与解决方法

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

研究环境get_price函数报错

KeyError: 'trade_time'
这是啥情况?

解决方案

在 JoinQuant (聚宽) 的研究环境中使用 get_price 函数时遇到 KeyError: 'trade_time' 报错,通常是因为对 Pandas DataFrame 的数据结构理解有误,尝试访问了一个不存在的列名

以下是导致该报错的常见原因及详细的解决方法:

1. 报错原因分析

在 JoinQuant 中,调用 get_price 函数获取单只股票的历史行情数据时,返回的是一个 pandas.DataFrame 对象。在这个 DataFrame 中:

  • 行索引 (Index) 是时间(datetime.datetime 对象)。
  • 列 (Columns) 是你请求的行情字段,如 'open', 'close', 'high', 'low', 'volume', 'money' 等。

如果你在代码中写了类似 df['trade_time'] 的语句,试图把时间当作一个普通的列来提取,Pandas 找不到名为 'trade_time' 的列,就会抛出 KeyError: 'trade_time'

2. 解决方法

根据你的实际需求,有以下几种解决方式:

方法一:直接通过 Index 获取时间(推荐)

如果你只是想获取时间序列,应该直接访问 DataFrame 的 index 属性,而不是把它当成列。

import jqdata

# 获取平安银行的日线数据
df = get_price('000001.XSHE', start_date='2023-01-01', end_date='2023-01-10', frequency='daily')

# 错误写法:会导致 KeyError: 'trade_time'
# times = df['trade_time'] 

# 正确写法:直接获取时间索引
times = df.index
print(times)

方法二:将时间索引转换为普通的列

如果你后续的数据处理(例如使用某些机器学习库或绘图库)必须要求时间作为一个普通的列存在,你可以使用 Pandas 的 reset_index() 方法将索引变成列,并重命名。

import jqdata

# 获取数据
df = get_price('000001.XSHE', start_date='2023-01-01', end_date='2023-01-10', frequency='daily')

# 将 index 转换为普通的列,默认列名为 'index'
df = df.reset_index()

# 将列名 'index' 重命名为你想要的 'trade_time'
df = df.rename(columns={'index': 'trade_time'})

# 现在你可以安全地使用 df['trade_time'] 了
print(df['trade_time'].head())

方法三:检查多标的查询时的数据结构

如果你使用 get_price 同时查询了多只股票(传入了股票列表),并且设置了 panel=False(推荐做法,因为 Panel 已被 Pandas 弃用),返回的 DataFrame 结构会有所不同。此时,时间仍然是索引,但列变成了 MultiIndex 或者你需要根据具体返回结构来解析。

# 查询多只股票
df_multi = get_price(['000001.XSHE', '000002.XSHE'], start_date='2023-01-01', end_date='2023-01-05', panel=False)

# 此时 df_multi 的 index 依然是时间
print(df_multi.index)

总结

KeyError 的本质是“字典或 DataFrame 中找不到对应的键/列名”。在使用 JoinQuant 的 API 时,建议先使用 print(df.head())print(df.columns) 查看一下返回数据的真实结构,确认时间是作为 Index 还是 Column 存在,这样就能有效避免此类错误。