我使用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],但它不起作用
答案 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])