2012-12-13 5 views
7

Ich habe ähnliche Daten wie in diesem gist gesehen und ich versuche, die Daten mit numpy zu extrahieren. Ich bin ziemlich neu in Python so ichnumpy.genfromtxt mit datetime.strptime Umrechner

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

Wo, wie kann es so mit dem folgenden Code zu tun versucht, in dem Kern zu sehen sind 22 Reihen von Kopfmaterial. In IPython, wenn ich „run“ der folgende Code erhalte ich einen Fehler, der mit den folgenden Enden:

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

Der vollständige ipython Fehlertrace here zu sehen ist.

Ich bin in der Lage, die sechs Spalten von numerischen Daten zu extrahieren nur gut ein Argument wie usecols genfromtxt = Bereich (0,6), aber wenn ich versuche, einen Konverter zu verwenden, um zu versuchen und die letzte Spalte angehen Ich bin ratlos. Alle und alle Kommentare würden uns freuen!

+0

versuchen Sie es mit read_table, die für die automatische Erkennung des Typs sorgt. –

Antwort

6

Das passiert, weil np.genfromtxt versucht, ein Float-Array zu erstellen, das fehlschlägt, da convertfunc ein Datetime-Objekt zurückgibt, das nicht als Float umgewandelt werden kann. Die einfachste Lösung wäre, das Argument dtype='object' einfach an np.genfromtxt zu übergeben, um die Erstellung eines Objektarrays zu gewährleisten und die Konvertierung zu verhindern. Dies würde jedoch bedeuten, dass die anderen Spalten als Zeichenfolgen gespeichert werden. Um sie richtig als Floats zu speichern, müssen Sie die dtype von jedem angeben, um eine structured array zu erhalten. Hier Ich gründe alle sich mit Ausnahme der letzten Spalte zu verdoppeln, die ein Objekt dtype sein wird:

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

Dies gibt Ihnen eine strukturierte Anordnung, die Sie mit den Namen zugreifen können Sie haben:

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

Danke. Das scheint sehr gut zu funktionieren. Ich schätze die Erklärung! –

4

können Sie Pandas verwenden read_table:

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

für mich gearbeitet. Sie müssen den Header separat verarbeiten, da sie eine variable Anzahl von Leerzeichen haben.

Verwandte Themen