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

如何将Pandas生成的K线图X轴从索引替换为日期?

问题:将K线图X轴从数据索引替换为日期

我用以下代码生成带移动平均线的K线图,但当前X轴显示的是数据索引,想把它替换为日期(数据里的日期格式是dd-mm-yyyy),需要做哪些修改?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc
#date format in data-> dd-mm-yyyy
nif = pd.read_csv('data.csv')
#nif['Date'] = pd.to_datetime(nif['Date'], format='%d-%m-%Y', utc=True)
mavg = nif['Close'].ewm(span=50).mean()
mavg1 = nif['Close'].ewm(span=13).mean()
fg, ax1 = plt.subplots()
cl = candlestick2_ohlc(ax=ax1,opens=nif['Open'],highs=nif['High'],lows=nif['Low'],closes=nif['Close'],width=0.4, colorup='#77d879', colordown='#db3f3f')
mavg.plot(ax=ax1,label='50_ema')
mavg1.plot(color='k',ax=ax1, label='13_ema')
plt.legend(loc=4)
plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
plt.show()

当前K线图X轴显示为索引,效果如下:
K线图X轴为索引的效果


解决方案

其实修改起来很简单,核心是让matplotlib识别并显示日期格式的X轴标签,具体步骤和修改后的代码如下:

  • 第一步:启用日期转换代码
    你之前注释掉了日期转换的代码,先把注释去掉,确保Date列被转换成pandas的datetime类型——这是让matplotlib能处理日期的前提:

    nif['Date'] = pd.to_datetime(nif['Date'], format='%d-%m-%Y', utc=True)
    
  • 第二步:替换X轴刻度为日期
    candlestick2_ohlc默认用数据索引作为X轴,所以我们需要手动指定刻度位置,并把位置对应的标签换成日期。同时为了避免日期重叠,建议旋转刻度标签。

  • 第三步:优化日期显示(可选)
    如果数据日期跨度大、密度高,直接显示所有日期会很拥挤,可以用matplotlib.dates模块自动调整刻度间隔,让显示更美观。

修改后的完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ohlc
import matplotlib.dates as mdates  # 新增:导入日期格式化工具

# date format in data-> dd-mm-yyyy
nif = pd.read_csv('data.csv')
# 启用日期转换,将字符串转为datetime类型
nif['Date'] = pd.to_datetime(nif['Date'], format='%d-%m-%Y', utc=True)
mavg = nif['Close'].ewm(span=50).mean()
mavg1 = nif['Close'].ewm(span=13).mean()

fg, ax1 = plt.subplots()
cl = candlestick2_ohlc(ax=ax1, opens=nif['Open'], highs=nif['High'], lows=nif['Low'], closes=nif['Close'],
                       width=0.4, colorup='#77d879', colordown='#db3f3f')

mavg.plot(ax=ax1, label='50_ema')
mavg1.plot(color='k', ax=ax1, label='13_ema')

# 设置X轴刻度:每个数据点对应一个刻度位置
ax1.set_xticks(range(len(nif)))
# 把刻度标签替换为日期,可自定义显示格式,比如'%Y-%m-%d'显示完整年月日
ax1.set_xticklabels(nif['Date'].dt.strftime('%m-%d'), rotation=45)  # 旋转45度避免标签重叠

# 可选:用mdates自动调整刻度间隔(比如每5天显示一个日期)
# ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d'))
# ax1.xaxis.set_major_locator(mdates.DayLocator(interval=5))

plt.legend(loc=4)
plt.subplots_adjust(left=0.09, bottom=0.20, right=0.94, top=0.90, wspace=0.2, hspace=0)
plt.show()

额外说明

  • 你可以根据需求修改dt.strftime()里的格式字符串,比如'%Y-%m-%d'显示完整年月日,'%b %d'显示月份缩写+日期;
  • 如果数据量很大,推荐启用mdates的自动刻度功能,避免X轴标签拥挤重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:13