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

运行股票K线图绘制代码遇ValueError:预期5值仅获4值的解决方法

解决 candlestick_ohlc 抛出的 ValueError: not enough values to unpack (expected 5, got 4) 问题

嘿,这个报错的原因很明确——candlestick_ohlc函数要求输入的数据必须包含5个值的组合:日期(数值格式)、开盘价、最高价、最低价、收盘价,但你当前构造的df_ohlc只给了4列,函数找不到第5个值(日期),自然就报错了。

具体修正思路:

  • 把原来作为索引的日期转为普通列,再将其转换成matplotlib能识别的数值格式
  • 严格按照函数要求的顺序排列列:日期、开盘价、最高价、最低价、收盘价(这个顺序不能乱,函数是按固定顺序解析数据的)

修正后的完整代码:

import pandas as pd
import pandas_datareader.data as web
from matplotlib import style
import matplotlib.pyplot as plt
!pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
from mpl_finance import candlestick_ohlc
import matplotlib.dates as mdates
import datetime as dt

style.use('ggplot')
start = dt.datetime(1996,1,1)
end = dt.datetime(2020,5,8)
df = web.DataReader('TATAMOTORS.NS', 'yahoo', start, end)

# 关键修正:构造符合函数要求的ohlc数据
df_ohlc = df.reset_index()  # 将索引中的日期转为普通列
df_ohlc['Date'] = df_ohlc['Date'].map(mdates.date2num)  # 把日期转换为matplotlib支持的数值格式
df_ohlc = df_ohlc[['Date', 'Open', 'High', 'Low', 'Close']]  # 按函数要求的顺序排列列

df_volume = df['Volume']

ax1 = plt.subplot2grid((6,1), (0,0), rowspan=5, colspan=1)
ax2 = plt.subplot2grid((6,1), (5,0), rowspan=1, colspan=1, sharex=ax1)
ax1.xaxis_date()

candlestick_ohlc(ax1, df_ohlc.values, width=2, colorup='g')
ax2.fill_between(df_volume.index.map(mdates.date2num), df_volume.values, 0)

plt.show()

简单复盘下问题根源:你之前把日期留在索引里,只提取了4个价格列,df_ohlc.values返回的是4列数组,而candlestick_ohlc每一行都要拆出5个值,所以就触发了not enough values to unpack的错误。现在把日期作为第一列加进去,就完全符合函数的输入要求啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:12:41