2012-12-13 21 views
7

Bu gist'da görülene benzer verilerim var ve verileri numpy ile ayıklamaya çalışıyorum. Aşağıdaki kodu ve özü görülebileceği gibi başlık malzemesinin 22 satır olduğundadatetime.strptime dönüştürücü ile numpy.genfromtxt

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}) 

ile bunu denedi yüzden piton oldukça yeni. Tam ipython hata izlemesi here görülebilir

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

: ipython olarak, ne zaman aşağıdaki kod aşağıdaki ile biten bir hata alırsınız "koşmak".

Nümerik verilere ait altı sütunu, genfromtxt gibi usecols = range (0,6) gibi bir argüman kullanarak gayet iyi bir şekilde ayıklayabiliyorum, ancak sonuncu sütunu denemek ve çözmek için bir dönüştürücü kullanmaya çalıştığımda stumped. Herhangi bir yorum tüm takdir edilecektir!

+0

türünü otomatik olarak algılayan read_table kullanmayı deneyin. –

cevap

6

np.genfromtxt, bir float dizisi oluşturmaya çalışıyor çünkü convertfunc, float olarak atılamayacak bir datetime nesnesi döndürdüğü için başarısız oluyor. En kolay çözüm, dtype='object' argümanını np.genfromtxt'a aktarmak ve bir nesne dizisinin yaratılmasını ve bir dönüşümün yüzdürülmesinin önlenmesini sağlamaktır. Ancak, bu diğer sütunların dizeler olarak kaydedileceği anlamına gelir. Onları float olarak düzgün bir şekilde saklamak için, structured array almak için her birinin dtype numarasını belirtmeniz gerekir.

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) 
:

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}) 

Bu, size verdiği isimlerle erişebilir yapılandırılmış diziyi verecek: İşte bir nesne d_type olacak son sütunu hariç ikiye katlamak için hepsini ayarlıyorum

+0

Teşekkür ederiz. Bu çok iyi çalışıyor gibi görünüyor. Açıklamaya minnettarım! –

4

Sen read_table panda kullanabilirsiniz:

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

benim için çalıştı. Ayrı olarak ayrılmış alan sayısı olduklarından, üstbilgiyi ayrı ayrı işlemeniz gerekir.

İlgili konular