使用datetime.strptime转换器的numpy.genfromtxt函数

8

我有类似于这个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})

如 gist 中所示,这里有22行的标题信息。在 Ipython 中,当我"运行"以下代码时,会得到以下错误:

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

完整的IPython错误跟踪可以在这里看到。
使用genfromtxt的参数usecols=range(0,6)可以轻松地提取六列数字数据,但是当我尝试使用转换器来处理最后一列时遇到了麻烦。非常感谢您的建议!

尝试使用read_table,它会自动检测类型。 - nom-mon-ir
2个回答

7
这是因为np.genfromtxt试图创建一个浮点数组,但convertfunc返回一个日期时间对象,无法转换为浮点数。最简单的解决方法是向np.genfromtxt传递参数dtype='object',确保创建一个对象数组并防止转换为浮点数。然而,这意味着其他列将被保存为字符串。要将它们正确保存为浮点数,需要指定每个的dtype以获取一个结构化数组。在这里,我将它们全部设置为双精度,除了最后一列,它将是一个对象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)

谢谢。看起来非常有效。感谢您的解释! - not link

4

您可以使用Pandas的read_table函数:

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

对我有用。由于标题是可变数量的空格分隔,因此您需要单独处理它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接