NumPy混合类型数据切片

3

我使用numpy.genfromtxt从csv文件中加载数据,而这个文件有混合的数据类型,就像下面的例子:

date,value1,value2
1997-02, 432, 1
1997-03, 300, 1
1997-04, 432, 0

我使用以下命令加载数据:

data = numpy.genfromtxt('data/test.csv', dtype=None, delimiter=',', skip_header=1)

并且我得到了。
array([(b'1997-02', 432, 1), (b'1997-03', 300, 1), (b'1997-04', 432, 0)], 
      dtype=[('f0', 'S7'), ('f1', '<i8'), ('f2', '<i8')])

现在,我只需要这个数据的日期,我该如何切割混合类型的numpy数组?我尝试使用data[:,0],但它无法正常工作。

2个回答

1
你可以使用字段名称:

data['f0']

# array([b'1997-02', b'1997-03', b'1997-04'], 
#       dtype='|S7')

为了阅读方便,我认为您想要指定names = True而不是skip_header,这样第一行将被读入作为结构化数组的字段名:
data = np.genfromtxt('data/test.csv', dtype=None, delimiter=',', names = True)
​    
data
# array([(b'1997-02', 432, 1), (b'1997-03', 300, 1), (b'1997-04', 432, 0)], 
#       dtype=[('date', 'S7'), ('value1', '<i8'), ('value2', '<i8')])

现在您可以将 date 作为变量访问:
data['date']
# array([b'1997-02', b'1997-03', b'1997-04'], 
#       dtype='|S7')

1
使用dtype=None时,它会推断字段的数据类型,在这种情况下,一个为字符串,其余为整数。您可以通过np.datetime64定义('M'表示月份)来细化数据类型。
In [419]: dt = ['datetime64[M]', 'i', 'i']
In [420]: data=np.genfromtxt(txt.splitlines(), delimiter=',',names=True, dtype=dt)
In [421]: data
Out[421]: 
array([('1997-02', 432, 1), 
       ('1997-03', 300, 1), 
       ('1997-04', 432, 0)], 
      dtype=[('date', '<M8[M]'), ('value1', '<i4'), ('value2', '<i4')])

这是一个形状为(3,)的1维结构化数组。它没有列,而是具有命名为fields的字段,可以通过名称而不是索引访问这些字段。
In [422]: data['date']
Out[422]: array(['1997-02', '1997-03', '1997-04'], dtype='datetime64[M]')

如果您更愿意使用字符串,则可以使用默认值。但是将datetime对象转换为其他对象也很容易。
天数:
In [424]: data['date'].astype('datetime64[D]')
Out[424]: array(['1997-02-01', '1997-03-01', '1997-04-01'], dtype='datetime64[D]')

字符串

In [427]: data['date'].astype('U7')
Out[427]: 
array(['1997-02', '1997-03', '1997-04'], 
      dtype='<U7')

"

datetime对象:

"
In [428]: data['date'].tolist()
Out[428]: 
[datetime.date(1997, 2, 1),
 datetime.date(1997, 3, 1),
 datetime.date(1997, 4, 1)]

整数:

In [429]: data['date'].astype(int)
Out[429]: array([325, 326, 327])

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