2017-12-03 29 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を成功裏に設定しようとしました。 this answerに私の問題の解決策が見当たらないことを認めなければなりません。なぜならファイルに特殊文字が含まれていないからです。少なくとも私はそれらを見ません。

どうすればこの問題をpython2に戻すことなく解決できますか?

+0

あなたが開いている(genfromtxtを試してみました( 'test.dat'、encoding = 'utf-8'))、...より効率的、 pandas.read_csv? –

+0

'genfromtxt(open( 'test.dat'、encoding = 'utf-8')) 'は文字列の代わりに文字列を提供しますが、pandasは魅力的です。それを答えに入れると、私はそれを受け入れます。 – Martin

+0

'genfromtxt'はファイルをバイナリモードで開き、バイトテスト(Py3)で動作します。 https://stackoverflow.com/questions/33001373/loading-utf-8-file-in-python-3-using-numpy-genfromtxtの「コンバータ」ソリューションは役に立ちませんか? – hpaulj

答えて

0

私はあなたのコードを再現しようとすると、私は日付変換で問題を得る:

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を追加する場合:

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

コンバータはgenfromtxtを提供することに主張することをバイト文字列を処理します。

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')]) 

それは別のエラーですので、私は不足しているフィールドマーカーとして異なる-を使用したりしていないことがあります。

あなたはコンバータでdecodeで数年前から私のポストを見つけました:.... genfromtxtが未定義の理由でASCIIモードに落ちるようだ

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

関連する問題