2013-02-12 93 views
0

我一直在试图与gnuplot.py打印以下数据:蟒蛇gnuplotpy与日期时间

data = [[datetime.datetime(2013, 1, 15, 17, 45), 16.00], [datetime.datetime(2013, 1, 16, 17, 45), 15.98], [datetime.datetime(2013, 1, 17, 17, 45), 15.94]] 

所以我已经开始这样的:

gp=Gnuplot.Gnuplot() 
gp('set data style linespoints') 
gp('set xdata time') 
gp('set timefmt "%Y-%m-%d"') 
gp('set xrange ["2012-12-20":"2013-02-12"]') 
gp.plot(data) 

,我得到如下回应:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/dist-packages/Gnuplot/_Gnuplot.py", line 285, in plot 
    self._add_to_queue(items) 
    File "/usr/lib/python2.6/dist-packages/Gnuplot/_Gnuplot.py", line 255, in _add_to_queue 
    self.itemlist.append(PlotItems.Data(item)) 
    File "/usr/lib/python2.6/dist-packages/Gnuplot/PlotItems.py", line 549, in Data 
    data = utils.float_array(data[0]) 
    File "/usr/lib/python2.6/dist-packages/Gnuplot/utils.py", line 33, in float_array 
    return numpy.asarray(m, numpy.float32) 
    File "/usr/lib/python2.6/dist-packages/numpy/core/numeric.py", line 230, in asarray 
    return array(a, dtype, copy=False, order=order) 
ValueError: setting an array element with a sequence. 

然后,我试着将它转换为以下列表:

[['2013-01-15', 16.00], ['2013-01-16', 15.98], ['2013-01-17', 15.94]] 

相同的结果。

有没有人有线索问题在哪里?

谢谢。

+1

[这](http://stackoverflow.com/a/ 9720624/748858)可能对您有所帮助... – mgilson 2013-02-12 14:29:06

回答

2

的问题(我相信)在该行内的gnuplot-PY的,我掏出追溯的:

return numpy.asarray(m, numpy.float32) 

正在发生的事情是最终是gnuplot的-PY试图您的日期 - 转换将时间(或字符串)数据转换为numpy.float32对象。如果你愿意跳过一些环节,我们可以做这个工作。


在检查源代码后,解决方案的这部分可能实际上并不是必需的。 您需要做的第一件事是将utils.py中的该行更改为使用numpy.float64而不是numpy.float32,然后重新安装gnuplot-py。这是为了我们可以使用有点标准的时代符号。 (或者,你也可能绕过重新安装一步只是改变它在你的回溯引用的文件 - 它甚至可以让你的行号):

File "/usr/lib/python2.6/dist-packages/Gnuplot/utils.py", line 33, in float_array 
    return numpy.asarray(m, numpy.float32) 

现在线33读numpy.asarray(m,numpy.float64)


我们可以使用浮点数来存储时代信息(float32只是不给足够的精度,我不认为...)

def secs_since_epoch(date_time,epoch=datetime.datetime(1970,1,1,0,0,0)): 
    """ 
    compute seconds since a particular epoch. The default epoch is the unix 
    epoch -- e.g. Jan. 1 1970. 
    """ 
    dt = date_time - epoch #time elapsed since unix epoch 
    return dt.days*24*3600 + dt.seconds + dt.microseconds*1e-6 #converted to seconds 

你ç在datetime对象上使用这个函数将它们从日期时间对象转换为简单(双精度)浮点数。时间对象,还可以的Gnuplot谢天谢地阅读格式:

gp = Gnuplot.Gnuplot() 
gp('set data style linespoints') 
gp('set xdata time') 
gp('set timefmt "%s"') 
xmin = secs_since_epoch(datetime.datetime(2012,12,20,0,0)) 
xmax = secs_since_epoch(datetime.datetime(2012,2,12,0,0)) 
gp('set xrange [%s:%s]' % (xmin,xmax)) 
gp.plot(data) 

下面的脚本作品不行了我:

import datetime 
import Gnuplot 

data = [[datetime.datetime(2013, 1, 15, 17, 45), 16.00], 
     [datetime.datetime(2013, 1, 16, 17, 45), 15.98], 
     [datetime.datetime(2013, 1, 17, 17, 45), 15.94]] 

def secs_since_epoch(date_time,epoch=datetime.datetime(1970,1,1,0,0,0)): 
    """ 
    compute seconds since a particular epoch. The default epoch is the unix 
    epoch -- e.g. Jan. 1 1970. 
    """ 
    dt = date_time - epoch #time elapsed since unix epoch 
    return dt.days*24*3600 + dt.seconds + dt.microseconds*1e-6 #converted to seconds 

dt,vals = zip(*data) 
data = zip(map(secs_since_epoch,dt),vals) 

gp = Gnuplot.Gnuplot(debug=True) 
gp('set style data linespoints') 
gp('set xdata time') 
gp('set timefmt "%s"') 
xmin = secs_since_epoch(datetime.datetime(2012,12,20,0,0)) 
xmax = secs_since_epoch(datetime.datetime(2012,2,12,0,0)) 
#gp('set xrange [%s:%s]' % (xmin,xmax)) 
d = Gnuplot.Data(data) 
d.set_option(using="1:2") 
gp.plot(d) 
raw_input() 
+0

我已将utils.py中的第33行更改为float64,正如您所推荐的那样。相同的输出,但在第33行float64。然后,我已经重新安装python-gnuplot。这是因为它是第33行float32。 – 2013-02-12 15:24:14

+0

@DaniloMitrovic - 这里有更多的转储比我最初预期的,其中大多数涉及gnuplot的timeformat需要使用规范。 - 但是,它看起来像我有一个工作版本。另外,阅读源代码中的注释使得看起来我们实际上并不需要将'numpy.float32'改为'numpy.float64',因为看起来'float32'将会抛出一个异常,如果它不适合一个值然后gnuplotpy再次尝试使用更大的数据类型。 – mgilson 2013-02-12 15:55:05

+0

它的工作原理。谢谢。 – 2013-02-12 18:32:30