(注意:我主要是Python新手,所以我的代码比优雅的代码更具功能性,所以我希望它能起作用。)
使用Python 3.6和pygal 2,我试图从存储阵列的REST API中读取json格式的数据。我想提取等待时间值(读取,写入,总计)并创建一个散点图,显示这些值。
我从有关绘制日期here的pygal文档开始。
json中的时间戳都以纪元毫秒为单位。因此,当我阅读它们时,我必须进行分割以使它们与日期时间库一起工作。
示例json数据部分:
[
1532908042508,
{
"latency.total": 1.09258,
"partialBlocksRatio.total": 18.58528,
"iops.read": 5984.2,
"latency.read": 1.1011,
"iops.write": 2181.4,
"throughput.read": 1461.03762,
"throughput.write": 105.14331,
"throughput.total": 1566.18092,
"iops.total": 8165.6,
"latency.write": 1.06919
}
],
我的问题是,一旦获得数据,便是如何将其馈入pygal。我首先定义图表(摘自pygal doc示例)
我提取数据,将纪元毫秒转换为秒,将时间字符串创建为所需的格式(Y,m,d,H,M,S),然后将该列表放入列表中。 接下来将等待时间数据加载到列表中。 加载所有数据后,我将其添加到pygal并尝试渲染为文件。
if key.lower() == 'history':
for key2, historyData in value:
epochSec = key2 / 1000.0 # The key for each history entry is epoch time in milliseconds. Time functions in Python
# appear to want seconds. So the division is needed.
timeStamp = [datetime.fromtimestamp(epochSec).strftime('%Y, %m,
%d, %H, %M, %S')] # Create the list format used for pygal
timeStamps.append(timeStamp)
#print(timeStamp)
for key3 in historyData:
if key3.lower() == 'latency.read':
perfHistory.append(historyData[key3])
for stamp in timeStamps:
#print(stamp[0])
xy_dateLine.add("", datetime(int(stamp[0])),perfHistory)
xy_dateLine.render_to_file('scatter4-1.svc')
错误是 追溯(最近一次通话): 文件“ C:/ Users /../ python / XIO_DataPlotting5.py”,第57行,在 xy_dateLine.add(“”,datetime(int(stamp [0])),perfHistory) ValueError:以10为底的int()的无效文字:'2018,07,22,18,02,07'
我在这里的感觉是,我忽略了一些简单的事情,但是我却迷茫了。我是否使这个复杂化了?是否有我的Google-fu发现的pygal教程?
答案 0 :(得分:0)
您正在尝试将字符串('2018,07,22,18,02,07')转换为int,因此将其值转换为Error。
答案 1 :(得分:0)
我花了大约一个小时来尝试解决一个密切相关的问题–因此,尽管事实已久,但我认为我会分享我的解决方案...
尽管PyGal文档并不清楚,事实上– PyGal实际上直接支持UNIX时代的时间/日期...
例如,在2014年绘制三个点(挑选我在玩的数字)—代码就是:
dateline.add('Epoch Time', [
(1389830399, 400),
(1402826470, 450),
(1420029285, 500)])
或者是完整示例–
import pygal
from datetime import date
dateline = pygal.DateLine(x_label_rotation=45, range=(0, 750))
dateline.x_labels = [
date(2014, 1, 1),
date(2014, 3, 1),
date(2014, 5, 1),
date(2014, 7, 1),
date(2014, 9, 1),
date(2014, 11, 1),
date(2014, 12, 31)
]
dateline.add('Time', [
(1389830399, 400),
(1402826470, 450),
(1420029285, 500)])
dateline.render_to_png("test.png")
哪个会给你一个这样的图形:
无论如何,我希望这可以节省别人像我刚遇到的同样头痛! :-)