2017-02-03 3 views
2

I numpy.genfromtxt verwenden, um Daten aus einer CSV-Datei zu laden, und diese Datei-Datentyp gemischt, wie die folgenden:numpy Daten mit Mischtyp Aufschneiden

date,value1,value2 
1997-02, 432, 1 
1997-03, 300, 1 
1997-04, 432, 0 

I den folgenden Befehl verwenden, um Daten zu laden:

data = numpy.genfromtxt('data/test.csv', dtype=None, delimiter=',', skip_header=1) 

und ich

array([(b'1997-02', 432, 1), (b'1997-03', 300, 1), (b'1997-04', 432, 0)], 
     dtype=[('f0', 'S7'), ('f1', '<i8'), ('f2', '<i8')]) 

Jetzt möchte ich nur das Datum dieser Daten, wie kann ich die numpy Array mit gemischten Scheiben schneiden Art? Ich habe versucht, Daten zu verwenden, [: 0], aber es nicht

Antwort

1

funktioniert Sie den Feldnamen verwenden können:

data['f0'] 

# array([b'1997-02', b'1997-03', b'1997-04'], 
#  dtype='|S7') 

Und weiter für Ihre Lesung Zweck, ich glaube, Sie angeben möchten, die names = True statt skip_header so dass die erste Zeile wird als die Feldnamen des strukturierten Array eingelesen werden:

data = np.genfromtxt('data/test.csv', dtype=None, delimiter=',', names = True) 
​  
data 
# array([(b'1997-02', 432, 1), (b'1997-03', 300, 1), (b'1997-04', 432, 0)], 
#  dtype=[('date', 'S7'), ('value1', '<i8'), ('value2', '<i8')]) 

Jetzt können Sie date als Zugang:

data['date'] 
# array([b'1997-02', b'1997-03', b'1997-04'], 
#  dtype='|S7') 
1

Mit dtype=None folgert es Feld dtypes, in diesem Fall eine Strings, der Rest ganzen Zahlen. Sie können die dtype mit einer np.datetime64 Definition ('M' für Monate) verfeinern

In [419]: dt = ['datetime64[M]', 'i', 'i'] 
In [420]: data=np.genfromtxt(txt.splitlines(), delimiter=',',names=True, dtype=dt) 
In [421]: data 
Out[421]: 
array([('1997-02', 432, 1), 
     ('1997-03', 300, 1), 
     ('1997-04', 432, 0)], 
     dtype=[('date', '<M8[M]'), ('value1', '<i4'), ('value2', '<i4')]) 

dies ein 1D-Array mit strukturierter Form (3,). Anstelle von Spalten hat es den Namen fields, auf die nach Namen und nicht nach Index zugegriffen wird.

Bleiben Sie mit dem Standard, wenn Sie lieber mit der Zeichenfolge arbeiten würden. Aber es ist einfach, die Datetime-Objekte, um die Dinge

Tage zu konvertieren:

In [424]: data['date'].astype('datetime64[D]') 
Out[424]: array(['1997-02-01', '1997-03-01', '1997-04-01'], dtype='datetime64[D]') 

Saiten

In [427]: data['date'].astype('U7') 
Out[427]: 
array(['1997-02', '1997-03', '1997-04'], 
     dtype='<U7') 

datetime Objekte:

In [428]: data['date'].tolist() 
Out[428]: 
[datetime.date(1997, 2, 1), 
datetime.date(1997, 3, 1), 
datetime.date(1997, 4, 1)] 

ganzen Zahlen:

In [429]: data['date'].astype(int) 
Out[429]: array([325, 326, 327])