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

Gnuplot.py传入日期字符串绘图触发ValueError的解决方法

问题原因
  • Gnuplot.py的Gnuplot.Data()方法默认会在Python侧将传入的所有序列数据通过numpy.asarray(..., numpy.float32)强制转换为32位浮点数数组,这一步转换发生在数据发送到底层Gnuplot进程之前。
  • 你提前执行的set xdata time、set timefmt等配置仅作用于Gnuplot进程接收数据后的解析逻辑,无法干预Python侧提前做的类型强制转换,因此字符串格式的日期会直接触发类型转换报错。
  • 命令行直接调用Gnuplot时不存在Python层的预处理逻辑,所有数据解析由Gnuplot自行完成,因此不会出现该问题。
修复方案

你可以任选以下两种方案解决问题:

方案1:传入原始格式化字符串跳过Python侧数值转换

将日期和数值拼接为Gnuplot可直接识别的、换行分隔的文本字符串传入Gnuplot.Data(),此时模块不会对字符串内容做浮点强转,会直接将内容发送给Gnuplot按你配置的时间规则解析。
修正后代码:

#!/usr/bin/env python
import Gnuplot

dates   = ['2022-04-12', '2022-04-16', '2022-04-18']
amounts = ['585',        '405',        '345']
# 拼接为每行 日期 数值 格式的原始数据块
raw_data = "\n".join([f"{date} {val}" for date, val in zip(dates, amounts)])

g = Gnuplot.Gnuplot(persist=True)
g('set xdata time')
g('set timefmt "%Y-%m-%d"')
g('set format x "%Y-%m-%d"')
d = Gnuplot.Data(raw_data, with_='lp', using='1:2')
g.plot(d)

方案2:提前将日期转为时间戳数值

在Python侧先把日期字符串转换为Gnuplot默认支持的Unix秒级时间戳(数值类型),既可以通过Gnuplot.py的浮点类型检查,也能被Gnuplot正确识别为时间数据。
修正后代码:

#!/usr/bin/env python
import Gnuplot
from datetime import datetime

dates   = ['2022-04-12', '2022-04-16', '2022-04-18']
amounts = [585,        405,        345]
# 转换为Unix秒级时间戳
timestamps = [datetime.strptime(d, "%Y-%m-%d").timestamp() for d in dates]

g = Gnuplot.Gnuplot(persist=True)
g('set xdata time')
g('set timefmt "%s"') # 匹配秒级时间戳格式
g('set format x "%Y-%m-%d"') # 坐标轴显示为日期格式
d = Gnuplot.Data(timestamps, amounts, with_='lp', using='1:2')
g.plot(d)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:24:13