2015-11-19 53 views
0

我使用numpy.genfromtxt加載文件以及一些字段是日期格式,但是,當我安裝一個轉換器來處理這些物品,我得到的是我不知道如何解決的錯誤(見下文):numpy的genfromtxt日期轉換錯誤

strptime() argument 0 must be str, not <class 'bytes'> 

在這一點上,我的目標是找到一種簡單的方法使用genfromtxt加載文件(),並從日期格式中選擇列轉換爲一個整數(紀元,例如) - 但是,我正在尋找任何可行的方法(不一定是我所說明的方法)。

任何幫助表示讚賞。

(詳情如下)

  • 運行中的virtualenv
  • 使用MacOS的
  • 使用Python V3.5

文件(略)是一個簡單的CSV格式:

SomeField,SomeDate 
1,2013-08-16 

代碼:

import numpy as np 
import time 

def main(): 
    pathRaw = 'data/homesite-quote-conversion/temp.csv' 
    str2epoch = lambda x: time.mktime(time.strptime(x, '%Y-%m-%d')) 
    converters = {1:str2epoch} 
    dataset = np.genfromtxt(open(pathRaw,'rb'), converters=converters, dtype=None, delimiter=',', skip_header=1) 
    return 

if __name__ == '__main__': 
    main() 

錯誤:

Traceback (most recent call last): 
File "test.py", line 12, in <module> 
    main() 
File "test.py", line 8, in main 
    dataset = np.genfromtxt(open(pathRaw,'rb'), converters=converters, dtype=None, delimiter=',', skip_header=1) 
File "{user-directory}/.virtualenvs/demo/lib/python3.5/site-packages/numpy/lib/npyio.py", line 1731, in genfromtxt 
    converter.iterupgrade(current_column) 
File "{user-directory}/.virtualenvs/demo/lib/python3.5/site-packages/numpy/lib/_iotools.py", line 766, in iterupgrade 
_ strict_call(_m) 
File "/{user-directory}/.virtualenvs/demo/lib/python3.5/site-packages/numpy/lib/_iotools.py", line 688, in _strict_call 
    new_value = self.func(value) 
File "test.py", line 6, in <lambda> 
    str2epoch = lambda x: time.mktime(time.strptime(x, '%Y-%m-%d')) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_strptime.py", line 494, in _strptime_time 
    tt = _strptime(data_string, format)[0] 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/_strptime.py", line 306, in _strptime 
    raise TypeError(msg.format(index, type(arg))) 
TypeError: strptime() argument 0 must be str, not <class 'bytes'> 

回答

0

錯誤是說time.strptime預期的第一個參數是一個str, not bytes

>>> x = b'2013-08-16' # x is bytes 
>>> import time 
>>> time.strptime(x, '%Y-%m-%d') 
TypeError: strptime() argument 0 must be str, not <class 'bytes'> 
>>> time.strptime(x.decode('ascii'), '%Y-%m-%d') # x.decode('ascii') is a str 
time.struct_time(tm_year=2013, tm_mon=8, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=228, tm_isdst=-1) 

這樣可以儘量避免錯誤使用

def str2epoch(x): 
    return time.mktime(time.strptime(x.decode('ascii'), '%Y-%m-%d')) 
+0

這工作完美!謝謝。 –