2013-05-01 140 views
4

我想用numpy loadtxt將csv文件加載到數組中。但似乎我無法正確加載日期時間。Python numpy loadtxt失敗,日期時間

下面演示發生了什麼。我做錯什麼了嗎?

>>> s = StringIO("05/21/2007,03:27") 
>>> np.loadtxt(s, delimiter=",", dtype={'names':('date','time'), 'formats':('datetime64[D]', 'datetime64[m]')}) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/npyio.py", line 796, in loadtxt 
items = [conv(val) for (conv, val) in zip(converters, vals)] 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/lib/npyio.py", line 573, in <lambda> 
    return lambda x: int(float(x)) 
ValueError: invalid literal for float(): 05/21/2007 
+0

[numpy.datetime64](http://docs.scipy.org/doc/numpy-dev/reference/arrays.datetime.html)需要一個破折號:'-',而不是斜線:'/'。不知道如何改變分隔符。 – askewchan 2013-05-01 19:02:21

+0

但這個工程雖然: np.datetime64(「05/21/2007」) 2007-05-21 00:00:00 – 2013-05-01 19:12:29

+0

請給你的代碼 – TN888 2013-05-01 19:19:34

回答

2

您還需要添加轉換器,如:

from matplotlib.dates import strpdate2num 
... 
np.loadtxt(s, delimiter=",", converters={0:strpdate2num('%m/%d/%Y'), 1:...}, dtype= ... 

當numpy的看到日期時間[64],它準備輸出型numpy.datetime64的列的D型格式。 numpy.datetim64是numpy.integer的子類,和loadtxt準備處理該列與下面的整數:

def _getconv(dtype): 
    typ = dtype.type 
    if issubclass(typ, np.bool_): 
     return lambda x: bool(int(x)) 
    if issubclass(typ, np.uint64): 
     return np.uint64 
    if issubclass(typ, np.int64): 
     return np.int64 
    if issubclass(typ, np.integer): 
     return lambda x: int(float(x)) 

    ... 

當它到達試圖轉換的點線796在numpyio:

items = [conv(val) for (conv, val) in zip(converters, vals)] 

它試圖使用lambda x: int(float(x))來處理輸入。當它這樣做時,它會試着將你的日期(05/27/2007)轉換爲浮動狀態並逐漸消失。上面的轉換函數strpdate2num會將日期轉換爲數字表示。

+0

來自matplotlib ......誰知道。 – askewchan 2013-05-02 03:12:27

+0

是的,它似乎我需要指定日期時間轉換器。 – 2013-05-02 21:35:08

2

嘗試MichealJCox的解決方案對我無效。我的numpy版本(1.8)不會接受strpdate2num('%m/%d/%Y')給出的時間編號,它只接受日期字符串或日期時間對象。因此,我使用的更復雜的轉換器,其由numpy的時間字符串轉換成時數,然後爲可使用的日期時間對象:

from matplotlib.dates import strpdate2num, num2date 
... 
convert = lambda x: num2date(strpdate2num('%m/%d/%Y')(x)) 
np.loadtxt(s, delimiter=",", converters={0:convert}, dtype= ... 

這似乎是一個龐大的解決方案雖然。