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

PyQtGraph绘制DataFrame时间序列:自定义X轴日期显示异常问题

PyQtGraph绘制DataFrame DateTime X轴问题解决方案

问题背景

  • 开发PyQtGraph应用,需将DataFrame中TimeStamp列的选定区间以准确日期时间作为X轴显示
  • 已自定义DateAxisItem类,重写tickValues和tickStrings方法,通过date_axis.attachToPlotItem(self.graphWidget.getPlotItem())绑定轴
  • 用interval = (df.TimeStamp - df.TimeStamp.min()).dt.total_seconds()生成X轴数据时,图形正常但X轴显示默认格式(如1/Jan/1h),而非目标TimeStamp
  • 直接使用x=df.TimeStamp(datetime64格式)会触发类型错误:
numpy.core._exceptions._UFuncBinaryResolutionError: ufunc 'subtract' cannot use operands with types dtype('<M8[ns]') and dtype('float64')

核心原因

PyQtGraph绘图函数不支持直接传入datetime64类型;而相对偏移的秒数不是绝对Unix时间戳,导致DateAxisItem无法解析为目标日期时间。

可行解决方案

1. 转换datetime为Unix时间戳(推荐)

将DataFrame的TimeStamp转换为绝对Unix时间戳(秒/毫秒),这是PyQtGraph和DateAxisItem默认支持的数值格式:

# 转换为秒级Unix时间戳(float类型)
x_data = df.TimeStamp.astype('datetime64[s]').astype(float)
# 若需要更高精度,可转为毫秒级
# x_data = df.TimeStamp.astype('datetime64[ms]').astype(float)

# 执行绘图
self.graphWidget.plot(x=x_data, y=df['your_y_column_name'])

此时DateAxisItem会自动将时间戳解析为对应日期时间,无需额外处理相对偏移。

2. 修正自定义DateAxisItem的实现

如果坚持使用自定义DateAxisItem,确保tickStrings方法基于传入的数值(Unix时间戳)转换为日期字符串:

from pyqtgraph import AxisItem
import datetime

class DateAxisItem(AxisItem):
    def tickStrings(self, values, scale, spacing):
        # 将Unix时间戳转换为本地datetime对象
        dt_list = [datetime.datetime.fromtimestamp(v) for v in values]
        # 根据刻度间距自动适配显示格式
        if spacing >= 86400:  # 1天及以上
            return [dt.strftime('%Y-%m-%d') for dt in dt_list]
        elif spacing >= 3600:  # 1小时及以上
            return [dt.strftime('%m-%d %H:%M') for dt in dt_list]
        else:  # 分钟及以下
            return [dt.strftime('%H:%M:%S') for dt in dt_list]

    def tickValues(self, minVal, maxVal, size):
        # 复用父类逻辑,确保刻度值基于时间戳范围生成
        return super().tickValues(minVal, maxVal, size)

绑定轴的逻辑保持不变,但需确保绘图前完成绑定:

date_axis = DateAxisItem(orientation='bottom')
date_axis.attachToPlotItem(self.graphWidget.getPlotItem())

3. 使用PyQtGraph内置DateAxisItem

PyQtGraph官方提供了现成的DateAxisItem,无需自行重写,直接导入使用即可:

from pyqtgraph.widgets.DateAxisItem import DateAxisItem

# 创建并绑定轴
date_axis = DateAxisItem(orientation='bottom')
date_axis.attachToPlotItem(self.graphWidget.getPlotItem())

# 转换时间戳并绘图
x_data = df.TimeStamp.astype('datetime64[s]').astype(float)
self.graphWidget.plot(x=x_data, y=df['your_y_column_name'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:18:24