X轴上的pygal绘制日期

时间:2018-08-01 22:10:27

标签: python python-3.x python-datetime pygal

(注意:我主要是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教程?

2 个答案:

答案 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")

哪个会给你一个这样的图形:

Example Graph

无论如何,我希望这可以节省别人像我刚遇到的同样头痛! :-)