2016-03-22 3 views
0

私は立ち往生しています。単純なCSVファイルをNumpyの配列に読み込み、自分自身を穴の中に掘り下げたように思えます。私はNumpyを新しくしています。通常、私はPython 3.4で簡単にCSVファイルを読むことができるので、何とかこれを乱してしまったのは間違いありません。私はパンダを使いたくないので、ナンシーを使って自分のスキルを上げることができると思っていましたが、実際にはこれを手に入れていません。誰かが私にgenfromtxtを使って正しい軌道上にいるかどうか教えてもらえれば、簡単な方法がありますし、正しい方向に微妙な思いをします。 CSVファイルを読み込み、2014年8月8日にdatetime列を操作し、それを残りの列とともにnumpy配列に入れたいとします。ここに私がこれまでに持っているものと、私が周りにコーディングするのに困っているエラーがあります。私はそこに日付を取得することはできますが、date.strftime( "%Y-%m-%d")をdatefuncに追加する方法は見当たりません。また、SYMの文字列をどのようにフォーマットしてエラーを回避するのか分かりません。どんな助けもありがとう。numpy UnicodeDecodeError私はgenfromtxtで正しいアプローチを使用しています

データ

2015-08-04 02:14:05.249392, AA, 0.0193103612, 0.0193515212, 0.0249713335, 30.6542480634, 30.7195875454, 39.640763021, 0.2131498442, 29.0406746589, 13524.5347810182, 89, 57, 99 
2015-08-04 02:14:05.325113, AAPL, 0.0170506271, 0.0137941891, 0.0105915637, 27.0670313481, 21.8975963326, 16.8135861893, -19.0986405157, -23.2172064279, 21.5647072302, 33, 26, 75 
2015-08-04 02:14:05.415193, AIG, 0.0080808151, 0.0073296055, 0.0076213535, 12.8278962785, 11.635388035, 12.0985236788, -9.2962105215, 3.980405659, -142.8175077335, 71, 42, 33 
2015-08-04 02:14:05.486185, AMZN, 0.0235649449, 0.0305828226, 0.0092703502, 37.4081902773, 48.5487257749, 14.7162247572, 29.7810062852, -69.6877219282, -334.0005615016, 2, 92, 10 

"コード" ごめん、まだ

import numpy as np 

from datetime import datetime 
from datetime import date,time 


datefunc = lambda x: datetime.strptime(x.decode("utf-8"), '%Y-%m-%d %H:%M:%S.%f') 
a = np.genfromtxt('/home/dave/Desktop/development/hvanal2016.csv',delimiter = ',', 
converters = {0:datefunc},dtype='object,str,float,float,float,float,float,float,float,float,float,float,float,float', 
names = ["date","sym","20sd","10sd","5sd","hv20","hv10","hv5","2010hv","105hv","abshv","2010rank","105rank","absrank"]) 

print(a["date"]) 
print(a["sym"]) 
print(a["20sd"]) 
print(a["hv20"]) 
print(a["absrank"]) 

エラーを学習

Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
[GCC 5.2.1 20151010] on linux 
Type "copyright", "credits" or "license()" for more information. 
>>> 
============================================================================== RESTART: /home/dave/3 9 15 my slope.py =============================================================================== 
[datetime.datetime(2015, 8, 4, 2, 14, 5, 249392) 
datetime.datetime(2015, 8, 4, 2, 14, 5, 325113) 
datetime.datetime(2015, 8, 4, 2, 14, 5, 415193) ..., 
datetime.datetime(2016, 3, 18, 1, 0, 25, 925754) 
datetime.datetime(2016, 3, 18, 1, 0, 26, 26400) 
datetime.datetime(2016, 3, 18, 1, 0, 26, 114828)] 
Traceback (most recent call last): 
File "/home/dave/3 9 15 my slope.py", line 19, in <module> 
    print(a["sym"]) 
File "/usr/lib/python3/dist-packages/numpy/core/numeric.py", line 1615, in array_str 
return array2string(a, max_line_width, precision, suppress_small, ' ', "", str) 
File "/usr/lib/python3/dist-packages/numpy/core/arrayprint.py", line 454, in array2string 
separator, prefix, formatter=formatter) 
File "/usr/lib/python3/dist-packages/numpy/core/arrayprint.py", line 328, in _array2string 
_summaryEdgeItems, summary_insert)[:-1] 
File "/usr/lib/python3/dist-packages/numpy/core/arrayprint.py", line 490, in _formatArray 
word = format_function(a[i]) + separator 
UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 0-3: code point not in range(0x110000) 

答えて

1

だからあなたのテキストの一部は

b'2015-08-04 02:14:05.249392 AA 0.0193103612 ...' 
です

(私はbを使用しています。なぜなら、Py3 genfromtxtがファイルをbytestringsで開くからです)。

ただし、区切り文字は,と指定します。私はカンマが見えません。

空想的なビジネスではなく、基本的な負荷を試してみましょう。

In [97]: txt=b"""2015-08-04 02:14:05.249392 AA 0.0193103612 0.0193515212 0.0249713335 30.6542480634 30.7195875454 39.640763021 0.2131498442 29.0406746589 13524.5347810182 89 57 99 
2015-08-04 02:14:05.325113 AAPL 0.0170506271 0.0137941891 0.0105915637 27.0670313481 21.8975963326 16.8135861893 -19.0986405157 -23.2172064279 21.5647072302 33 26 75 
""" 
In [98]: txt=txt.splitlines() 
In [99]: data=np.genfromtxt(txt,dtype=None) 
In [100]: data 
Out[100]: 
array([ (b'2015-08-04', b'02:14:05.249392', b'AA', 0.0193103612, 0.0193515212, 0.0249713335, 30.6542480634, 30.7195875454, 39.640763021, 0.2131498442, 29.0406746589, 13524.5347810182, 89, 57, 99), 
     (b'2015-08-04', b'02:14:05.325113', b'AAPL', 0.0170506271, 0.0137941891, 0.0105915637, 27.0670313481, 21.8975963326, 16.8135861893, -19.0986405157, -23.2172064279, 21.5647072302, 33, 26, 75)], 
     dtype=[('f0', 'S10'), ('f1', 'S15'), ('f2', 'S4'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<f8'), ('f9', '<f8'), ('f10', '<f8'), ('f11', '<f8'), ('f12', '<i4'), ('f13', '<i4'), ('f14', '<i4')]) 

日時情報が2つのフィールドである:

In [101]: data[['f0','f1']] 
Out[101]: 
array([(b'2015-08-04', b'02:14:05.249392'), 
     (b'2015-08-04', b'02:14:05.325113')], 
     dtype=[('f0', 'S10'), ('f1', 'S15')]) 

あなたdatefunctionがバイトストリング

In [102]: datefunc(b'2015-08-04 02:14:05.249392') 
Out[102]: datetime.datetime(2015, 8, 4, 2, 14, 5, 249392) 

で動作しません。しかし、それは '' 区切り文字で定義されている(2つのフィールドが必要です)。したがって、2つのフィールドに分割するのではなく、2つの部分文字列を1つに解析する方法を理解する必要があります。

サンプルtxtを実際に,の区切り文字(日付と時刻の間ではない)に変更し、何が動作するかを試してみることもあります。私が手,区切りのテキストで


In [117]: data=np.genfromtxt(txt,delimiter=',',dtype=None,usecols=[0,1,2,3]) 
In [118]: data.dtype 
Out[118]: dtype([('f0', 'S26'), ('f1', 'S5'), ('f2', '<f8'), ('f3', '<f8')]) 
In [119]: data['f0'] 
Out[119]: 
array([b'2015-08-04 02:14:05.249392', b'2015-08-04 02:14:05.325113', 
     b'2015-08-04 02:14:05.415193', b'2015-08-04 02:14:05.486185'], 
     dtype='|S26') 
In [120]: [datefunc(d) for d in data['f0']] 
Out[120]: 
[datetime.datetime(2015, 8, 4, 2, 14, 5, 249392), 
datetime.datetime(2015, 8, 4, 2, 14, 5, 325113), 
datetime.datetime(2015, 8, 4, 2, 14, 5, 415193), 
datetime.datetime(2015, 8, 4, 2, 14, 5, 486185)] 

全文は14の1行目のフィールド、および他の13を持っているので、私はusecolsを使用。

私は(代わりに簡単Noneの)dtypeを指定した場合、私はこれらのDateTimeオブジェクトを持つ第一フィールド内の文字列置換することができます。

In [122]: data=np.genfromtxt(txt,delimiter=',',dtype='O,S5,f,f',usecols=[0,1,2,3]) 
In [123]: data 
Out[123]: 
array([ (b'2015-08-04 02:14:05.249392', b' AA', 0.01931036077439785, 0.019351521506905556), 
     (b'2015-08-04 02:14:05.325113', b' AAPL', 0.01705062761902809, 0.01379418931901455),....], 
     dtype=[('f0', 'O'), ('f1', 'S5'), ('f2', '<f4'), ('f3', '<f4')]) 
In [124]: data['f0'] 
Out[124]: 
array([b'2015-08-04 02:14:05.249392', b'2015-08-04 02:14:05.325113', 
     b'2015-08-04 02:14:05.415193', b'2015-08-04 02:14:05.486185'], dtype=object) 
.... 
In [126]: data['f0']=[datefunc(d) for d in data['f0']] 
In [127]: data 
Out[127]: 
array([ (datetime.datetime(2015, 8, 4, 2, 14, 5, 249392), b' AA', 0.01931036077439785, 0.019351521506905556), 
     (datetime.datetime(2015, 8, 4, 2, 14, 5, 325113), b' AAPL', 0.01705062761902809, 0.01379418931901455),...], 
     dtype=[('f0', 'O'), ('f1', 'S5'), ('f2', '<f4'), ('f3', '<f4')]) 

を、コンバータで、あなたの呼び出しは(多かれ少なかれの作品この文字列で動作しますdatetime64

In [133]: data=np.genfromtxt(txt,dtype='object,S5,float,float', 
    converters = {0:datefunc},delimiter=',',usecols=[0,1,2,3]) 
In [134]: data 
Out[134]: 
array([ (datetime.datetime(2015, 8, 4, 2, 14, 5, 249392), b' AA', 0.0193103612, 0.0193515212), 
     (datetime.datetime(2015, 8, 4, 2, 14, 5, 325113), b' AAPL', 0.0170506271, 0.0137941891),...], 
     dtype=[('f0', 'O'), ('f1', 'S5'), ('f2', '<f8'), ('f3', '<f8')]) 

the numpy。これらのタイプはnumpyの数字で使用できます。

In [175]: data=np.genfromtxt(txt,dtype='M8[us],S5,float,float', 
    delimiter=',',usecols=[0,1,2,3]) 
In [176]: data 
Out[176]: 
array([ (datetime.datetime(2015, 8, 4, 9, 14, 5, 249392), b' AA', 0.0193103612, 0.0193515212), 
     (datetime.datetime(2015, 8, 4, 9, 14, 5, 325113), b' AAPL', 0.0170506271, 0.0137941891),...], 
     dtype=[('f0', '<M8[us]'), ('f1', 'S5'), ('f2', '<f8'), ('f3', '<f8')]) 

日時単位を参照してください:このImporting csv into Numpy datetime64から

In [154]: datefunc(b'2015-08-04 02:14:05.249392') 
Out[154]: datetime.datetime(2015, 8, 4, 2, 14, 5, 249392) 
In [155]: np.datetime64(b'2015-08-04 02:14:05.249392') 
Out[155]: numpy.datetime64('2015-08-04T02:14:05.249392-0700') 

私はこれが動作するようになった私が発見していなかったデータに「」申し訳ありませんがある@hpauljねえhttp://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#datetime-units

+0

のとき私はメッセージにデータをロードしました。また、データを5行に減らして読みやすくしました。 – theakson

+0

私は新しいテキストを試しました。フィールドミスカウントがありますが、私はそれを回避しました。 – hpaulj

+0

余分なマイルに行ってくれてありがとう、私はあなたのすべての良い仕事からnumpyでこれを行うための良い方法はないと思います。私のアプローチを改善しようとすると、あなたは素晴らしいスタートを切ってくれました。ありがとうございます – theakson

関連する問題