numpy.genfromtxt con el convertidor de datetime.strptime

Tengo datos similares a los que se ven en esta lista y estoy tratando de extraer los datos con números. Soy bastante nuevo en Python, así que intenté hacerlo con el siguiente código

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

Donde se puede ver en la esencia hay 22 filas de material de cabecera. En Ipython, cuando “ejecuto” el siguiente código, recibo un error que termina con lo siguiente:

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

La traza de error completa de ipython se puede ver aquí .

Soy capaz de extraer las seis columnas de datos numéricos bien usando un argumento para genfromtxt como usecols = rango (0,6), pero cuando bash usar un convertidor para tratar de abordar la última columna, estoy perplejo. ¡Cualquier y todos los comentarios serían apreciados!

Esto sucede porque np.genfromtxt está intentando crear una matriz flotante, que falla porque convertfunc devuelve un objeto de fecha y hora, que no se puede convertir como flotante. La solución más sencilla sería simplemente pasar el argumento dtype='object' a np.genfromtxt , asegurando la creación de una matriz de objetos e impidiendo que una conversión flote. Sin embargo, esto significaría que las otras columnas se guardarían como cadenas. Para que se guarden correctamente como flotadores, debe especificar el dtype de dtype de cada uno para obtener una matriz estructurada . Aquí los estoy configurando para que se dupliquen, excepto la última columna, que será un tipo de objeto:

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

Esto le dará una matriz estructurada a la que puede acceder con los nombres que dio:

 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) 

Puedes usar pandas read_table:

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

trabajó para mi. Debe procesar el encabezado por separado, ya que son números variables de espacio separado.