2013-02-12 88 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