numpy数据切片与混合类型

时间:2017-02-03 21:35:25

标签: python csv numpy

我使用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数组?我试图使用数据[:,0],但它不起作用

2 个答案:

答案 0 :(得分: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 :(得分:1)

使用dtype=None推导出字段dtypes,在本例中为一个字符串,其余为整数。您可以使用np.datetime64定义(&#39; M&#39;几个月)来优化dtype

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,)的1d结构化数组。而不是列名为fields的列,而不是索引。

In [422]: data['date']
Out[422]: array(['1997-02', '1997-03', '1997-04'], dtype='datetime64[M]')

如果您更喜欢使用字符串,请坚持使用默认值。但是将日期时间对象转换为事物很容易

天:

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