我的数据与此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排标题材料。在Ipython中,当我“运行”以下代码时,我收到一个以下结尾的错误:
TypeError: float() argument must be a string or a number
可以看到完整的ipython错误跟踪here。
我能够使用genfromtxt的参数提取六列数值数据,例如usecols = range(0,6),但是当我尝试使用转换器来尝试解决最后一列我感到困惑时。任何和所有评论将不胜感激!
答案 0 :(得分:6)
这种情况正在发生,因为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)
答案 1 :(得分:4)
您可以使用pandas read_table:
import pandas as pd
frame=pd.read_table('/tmp/gist', header=None, skiprows=22,delimiter='\s+')
为我工作。您需要单独处理标题,因为它们是可变数量的空格分隔。