我有与此 gist 中看到的数据类似的数据,我正在尝试使用 numpy 提取数据。我对 python 比较陌生,所以我尝试使用以下代码

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

在要点中可以看到有 22 行标题 Material 。在 Ipython 中,当我“运行”以下代码时,我收到一个以以下内容结尾的错误:
TypeError: float() argument must be a string or a number

完整的 ipython 错误跟踪可以在 here 中看到。

我能够使用像 usecols=range(0,6) 这样的 genfromtxt 参数来提取六列数字数据就好了,但是当我尝试使用转换器来尝试处理最后一列时,我被难住了。任何和所有评论将不胜感激!

最佳答案

发生这种情况是因为 np.genfromtxt 正在尝试创建一个 float 数组,该数组失败是因为 convertfunc 返回一个 datetime 对象,该对象不能转换为 float。最简单的解决方案是将参数 dtype='object' 传递给 np.genfromtxt ,确保创建对象数组并防止转换为浮点数。但是,这意味着其他列将被保存为字符串。要将它们正确保存为浮点数,您需要指定每个的 dtype 以获得 structured array 。在这里,除了最后一列,我将它们全部设置为双倍,这将是一个对象 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)

10-06 12:16