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")
这给你一个看起来像这样的图表:
无论如何,我希望这对其他人来说是有用的,因为我刚刚经历过同样的头痛! :-)
(注意:我在 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")
这给你一个看起来像这样的图表:
无论如何,我希望这对其他人来说是有用的,因为我刚刚经历过同样的头痛! :-)