You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用candlestick_ohlc时日期转换异常及格式化报错咨询

解决matplotlib candlestick_ohlc日期格式异常及年份超出范围的问题

我来帮你搞定这个K线图的日期问题!你遇到的ValueError: year 4172023 is out of range其实是踩了一个很常见的坑——日期没有转换成matplotlib能识别的数值格式,咱们一步步捋清楚:

错误原因分析

candlestick_ohlc函数要求日期必须是matplotlib专用的数值型日期(简单说就是把datetime对象转换成从公元1年开始累计的天数)。你出现的4172023年错误,大概率是把类似2023-04-17的日期直接转成了整数20230417,matplotlib把这个数当成了累计天数,算下来自然就变成了离谱的年份,直接超出了日期范围。

正确的解决步骤

1. 确保日期是datetime类型

不管你的日期是字符串还是其他格式,先转成Python的datetime对象,这是后续转换的基础。如果用pandas处理数据的话,一行代码就能搞定:

import pandas as pd
# 假设你的日期列叫'date',是字符串格式
df['date'] = pd.to_datetime(df['date'])

2. 转换成matplotlib数值型日期

mdates.date2num()把datetime对象转换成matplotlib能识别的数值:

import matplotlib.dates as mdates
df['mdate'] = mdates.date2num(df['date'])

3. 准备符合要求的OHLC数据

candlestick_ohlc要求输入的数据必须是**[数值日期, 开盘价, 最高价, 最低价, 收盘价]**的结构,所以要把转换后的日期放到第一列:

ohlc_data = df[['mdate', 'open', 'high', 'low', 'close']].values

4. 绘图并设置日期格式

这时候再调用DateFormatter就不会报错了,完整示例代码如下:

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from mplfinance.original_flavor import candlestick_ohlc  # 注意:旧版matplotlib.finance已弃用,改用这个
import pandas as pd

# 示例数据(替换成你的真实数据)
df = pd.DataFrame({
    'date': ['2023-04-17', '2023-04-18', '2023-04-19'],
    'open': [100, 102, 101],
    'high': [105, 104, 106],
    'low': [98, 100, 99],
    'close': [103, 101, 105]
})

# 日期转换流程
df['date'] = pd.to_datetime(df['date'])
df['mdate'] = mdates.date2num(df['date'])
ohlc_data = df[['mdate', 'open', 'high', 'low', 'close']].values

# 绘制K线图
fig, ax = plt.subplots(figsize=(10,6))
candlestick_ohlc(ax, ohlc_data, width=0.6, colorup='green', colordown='red')

# 设置日期显示格式
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
# 旋转日期标签避免重叠
plt.xticks(rotation=45)

plt.title('正常显示的K线图')
plt.xlabel('日期')
plt.ylabel('价格')
plt.tight_layout()
plt.show()

额外注意事项

  • 如果你之前用的是matplotlib.finance.candlestick_ohlc,这个模块已经被官方弃用了,建议安装mplfinance库(pip install mplfinance),然后用上面示例里的导入方式。
  • 如果是从CSV读取数据,读取时可以直接指定日期列解析:pd.read_csv('your_data.csv', parse_dates=['date']),省掉后续转换步骤。

内容的提问来源于stack exchange,提问作者Flavio de Falcao e Helena

火山引擎 最新活动