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

如何在PyQtGraph中设置%d.%m.%Y格式的文本日期轴

PyQtGraph 底部轴显示自定义日期格式解决方案

问题说明

现有PyQtGraph图表底部轴显示时间戳数值,需要替换为%d.%m.%Y格式的字符串日期,现有代码中尝试用DateAxisItem未达到预期效果。

实现步骤

  • 自定义继承自pg.AxisItem的轴类,重写tickStrings方法,将时间戳转换为目标格式的日期字符串。
  • 将自定义轴设置为PlotWidget的底部轴。
  • 确保X轴传入的是时间戳数值(PyQtGraph轴底层仍处理数值,仅修改显示的标签文本)。

修改后的完整代码

import pyqtgraph as pg
from datetime import datetime, timedelta
import pandas as pd
import ccxt

# 自定义日期轴类
class CustomDateAxis(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
        # 将时间戳转换为datetime对象,再格式化为'%d.%m.%Y'
        return [datetime.fromtimestamp(v).strftime('%d.%m.%Y') for v in values]

# 原类中的相关代码修改
# ...(其他原有代码保留)

        self.graph = pg.PlotWidget(self)
        self.graph.setBackground("w")
        self.graph.showGrid(x=True, y=True)
        pen = pg.mkPen(color=(90, 169, 240),  width=5)
        self.graph.setYRange(0, 1000)
        self.plot = self.graph.plot(
            [],
            [],
            pen=pen,
            symbol='o',
            symbolSize=4,
            symbolBrush="b",
        )
        
        self.widgets.append(self.graph)
        
        
    def optimize_view(self):
        self.graph.setGeometry(6, 0, self.width(), self.height() - 50)
        
    def setup_graph(self, sym):
        if sym != 'USDT':
            try:
                data = self.get_price_history(self.parent().valute, self.time_frame)
            except:
                self.plot.setData([], [])
                return  # 捕获异常后直接返回,避免后续报错
        else:
            data = []
        
        if not data:
            self.plot.setData([], [])
            return
            
        new_date = datetime.now() - timedelta(len(data) - 1)
        
        # 生成时间戳序列,确保和数据长度匹配
        res = pd.date_range(new_date, datetime.now(), periods=len(data)).tolist()
        res = [datetime.timestamp(i) for i in res]
        
        self.graph.setYRange(min(data), max(data))
        self.graph.setXRange(min(res), max(res))
        
        # 使用自定义日期轴替换底部轴
        date_axis = CustomDateAxis(orientation='bottom')
        self.graph.setAxisItems({'bottom': date_axis})
        
        self.plot.setData(res, data)
        
    def get_price_history(self, symbol, timeframe):
        exchange = ccxt.binance()
        data = exchange.fetch_ohlcv(f'{symbol}/USDT', timeframe)
        prices = [candle[3] for candle in data]
        return prices

关键修改点

  1. 自定义轴类:CustomDateAxis重写tickStrings方法,把每个刻度对应的时间戳直接转换成%d.%m.%Y格式的字符串。
  2. 修复数据长度匹配问题:原代码中pd.date_range生成的日期序列长度可能和data不匹配,改用periods=len(data)确保一一对应。
  3. 异常处理优化:捕获异常后直接返回,避免后续代码因data为空报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:00:03