2017-12-03 49 views
0

python3에서 numpy.genfromtxt()을 사용하여 다른 날짜의 데이터가 포함 된 파일을 읽으려고합니다. 파일은 기본적으로numpy.genfromtxt()를 사용하여 Python 3에서 UTF-8 파일로드

Date,Open,High,Low,Close,Volume 
1-Apr-15,108.33,108.66,108.33,108.66,290 

처럼 보이지만, 누락 된 값은 -으로 표시 될 수 있습니다.

다음 코드는 python2

str2date = lambda x: datetime.strptime(x, '%d-%b-%y').strftime('%Y-%m-%d') 
data = np.genfromtxt('test.dat', dtype="S9,f8,f8,f8,f8,f8", delimiter=',', names=True, missing_values='-', converters={0: str2date}) 

에서 잘 작동하지만 기본 인코딩 및 입력의 인코딩을 설정하여 제안 된 솔루션으로

UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128) 

locale.getpreferredencoding(False) 반환 UTF-8 python3에 실패 예를 들어 here으로 제안 된 스트림은 약간 까다 롭습니다. 또한 성공하지 않고 encoding of the terminal을 설정하려고했습니다. 나는 또한 파일에 포함 된 특수 문자가 없기 때문에 나는 내 문제에 대한 해결책을 보지 못한다는 것을 인정해야한다. 적어도 나는 그들을 보지 못한다.

어떻게하면 python2로 되돌아 가지 않고이 문제를 해결할 수 있습니까? 내가 날짜 변환 문제를 얻을 코드를 재생하려고하면

+0

그것은 정의되지 않은 이유에 대한 아스키 모드에 빠진다 genfromtxt이 보인다 (당신이 genfromtxt을 시도 열려 :

당신은 컨버터의 decode과 전에 몇 년에서 내 게시물을 발견 ('test.dat', encoding = 'utf-8'), ...?보다 효율적인, pandas.read_csv? –

+0

'genfromtxt (open ('test.dat', encoding = 'utf-8')) '문자열 대신에 제공되는 바이트에 대해 불평하지만 팬더는 매력처럼 작동합니다. 당신은 대답에 그것을 넣을 것입니다. 나는 그것을 받아 들일 것입니다. – Martin

+0

'genfromtxt'는 바이너리 모드로 파일을 열고 bytestrings (Py3)과 함께 작동합니다. https://stackoverflow.com/questions/33001373/loading-utf-8-file-in-python-3-using-numpy-genfromtxt의 '변환기'솔루션이 도움이되지 않습니까? – hpaulj

답변

0

는 :

def foo(x): 
    return str2date(x.decode()) 

컨버터 genfromtxt가 제공 주장하는 바이트 문자열을 처리

Out[405]: b'1-Apr-15' 
In [406]: str2date(_) 
--------------------------------------------------------------------------- 
... 
----> 1 str2date = lambda x: datetime.strptime(x, '%d-%b-%y').strftime('%Y-%m-%d') 

TypeError: strptime() argument 1 must be str, not bytes 

나는 decode을 추가하는 경우 .

In [410]: data = np.genfromtxt('stack47619155.txt', dtype="S9,f8,f8,f8,f8,f8", 
    ...: delimiter=',', names=True, missing_values='-', converters={0: foo}) 
In [411]: data 
Out[411]: 
array([(b'2015-04-0', 108.33, 108.66, 108.33, 108.66, 290.), 
     (b'2015-04-0',  nan, 108.66,  nan, 108.66, 290.), 
     (b'2015-04-0', 108.33, 108.66, 108.33, 108.66, nan)], 
     dtype=[('Date', 'S9'), ('Open', '<f8'), ('High', '<f8'), ('Low', '<f8'), ('Close', '<f8'), ('Volume', '<f8')]) 
In [412]: data = np.genfromtxt('stack47619155.txt', dtype="U9,f8,f8,f8,f8,f8", 
    ...: delimiter=',', names=True, missing_values='-', converters={0: foo}) 
In [413]: data 
Out[413]: 
array([('2015-04-0', 108.33, 108.66, 108.33, 108.66, 290.), 
     ('2015-04-0',  nan, 108.66,  nan, 108.66, 290.), 
     ('2015-04-0', 108.33, 108.66, 108.33, 108.66, nan)], 
     dtype=[('Date', '<U9'), ('Open', '<f8'), ('High', '<f8'), ('Low', '<f8'), ('Close', '<f8'), ('Volume', '<f8')]) 

그것은 다른 오류, 그래서 나는 누락 된 필드 마커로 다른 -을 사용하지 않았거나 수 있습니다. ....

Loading UTF-8 file in Python 3 using numpy.genfromtxt

+0

python2에는'decode()'가 필요합니다. python3의 경우 오류가 발생합니다 (시스템에서). 'decode()'가없는 변환 자체는'print (str2date ('1-Apr-15'))'에서 잘 실행됩니다. – Martin

+0

'print (str2date (b'1-Apr-15 '))'는 어떻습니까? – hpaulj

+0

그럼'디코드 '가 필요합니다. 그러나'genfromtxt'는 여전히'ascii' 문제로 실패합니다. – Martin