pygal 在 x 轴上绘制日期

pygal plotting dates on the x-axis

(注意:我在 Python 大多是新手,所以我的代码比优雅更实用,或者我希望它能发挥作用。)

使用 Python 3.6 和 pygal 2 我试图从存储阵列的 REST API 中读入 json 格式的数据。我想提取延迟值(读取、写入、总计)并创建一个散点图来显示这些值。

我从有关绘制日期的 pygal 文档开始,here

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 文档示例)

我提取数据,将纪元毫秒转换为秒,创建时间字符串以采用所需的格式(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 教程?

您正在尝试将字符串 ('2018, 07, 22, 18, 02, 07') 转换为 int,因此出现 valueError。

我刚刚花了大约一个小时来尝试解决一个密切相关的问题 – 所以尽管这已经很老了,但我认为我应该分享我的解决方案...

尽管 PyGal 文档并没有说得很清楚 – PyGal 实际上直接支持 time/dates in UNIX epoch time...

例如,在 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")

这给你一个看起来像这样的图表:

无论如何,我希望这对其他人来说是有用的,因为我刚刚经历过同样的头痛! :-)