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
相关产品推荐
相关产品推荐

