2012-12-13 3 views
7

私はこのgistに見られるのと同様のデータを持っており、numpyでデータを抽出しようとしています。私は、次のコード主旨に見られるように、ヘッダ材料の22行があるnumpy.genfromtxt with datetime.strptime converter

import numpy as np 
from datetime import datetime 

convertfunc = lambda x: datetime.strptime(x, '%H:%M:%S:.%f') 
col_headers = ["Mass", "Thermocouple", "T O2 Sensor",\ 
       "Igniter", "Lamps", "O2", "Time"] 
data = np.genfromtxt(files[1], skip_header=22,\ 
        names=col_headers,\ 
        converters={"Time": convertfunc}) 

でそうしようとしたので、私は、Pythonにかなり新しいです。 Ipythonでは、ときに私「実行」次のコードは、私は次で終わるのエラーが表示されます。

TypeError: float() argument must be a string or a number 

フルipythonのエラートレースがhereを見ることができます。

私は、usecols = range(0,6)のようにgenfromtxtの引数を使って数値データの6つのカラムを抽出することができますが、最後のカラムを試してみようとすると、困った。すべてのコメントをいただければ幸いです!

+0

タイプを自動検出するread_tableを試してみてください。 –

答えて

6

np.genfromtxtが浮動小数点配列を作成しようとしています。これは、convertfuncがfloat型にキャストできないdatetimeオブジェクトを返すため失敗します。最も簡単な解決策は、引数dtype='object'np.genfromtxtに渡し、オブジェクト配列の作成と浮動小数点への変換を防ぐことです。ただし、これは他の列が文字列として保存されることを意味します。浮動小数点数として適切に保存するには、を取得するにはそれぞれのdtypeを指定する必要があります。ここで私は、オブジェクトDTYPEとなります最後の列を除いて倍増し、それらすべてを設定しています:

dd = [(a, 'd') for a in col_headers[:-1]] + [(col_headers[-1], 'object')] 
data = np.genfromtxt(files[1], skip_header=22, dtype=dd, 
        names=col_headers, converters={'Time': convertfunc}) 

これはあなたがあなたが与えた名前でアクセスできる構造化された配列を与える:

In [74]: data['Mass'] 
Out[74]: array([ 0.262 , 0.2618, 0.2616, 0.2614]) 
In [75]: data['Time'] 
Out[75]: array([1900-01-01 15:49:24.546000, 1900-01-01 15:49:25.171000, 
       1900-01-01 15:49:25.405000, 1900-01-01 15:49:25.624000], 
       dtype=object) 
+0

ありがとうございます。それはとてもうまくいくようです。私は説明を感謝します! –

4

あなたはread_tableパンダを使用することができます。

import pandas as pd 
    frame=pd.read_table('/tmp/gist', header=None, skiprows=22,delimiter='\s+') 

は私のために働きました。ヘッダーは別々のスペースで区切られているので、別々に処理する必要があります。