1

我对 numpy 比较陌生。我已经从 .csv 文件中导入数据,日期在 YYYY、MM、DD 和其他一些内容中。我想将所有内容放入一个数组中,日期采用“正确”的日期时间格式。这是我的代码:

na_trades = np.zeros((number_of_orders,), dtype = ('datetime64,a5,a5,i4'))
for row in range(number_of_orders):
    order = na_trades_csv[row]
    order_date = dt.datetime(order[0],order[1],order[2])
    order_date64 =  np.datetime64(order_date)
    na_trades[row] = (order_date64,order[3],order[4],order[5])

但我得到错误ValueError: error setting an array element with a sequence。知道为什么会这样吗?提前感谢您的帮助!

4

2 回答 2

2

使用 numpy 版本 1.6.2,dtype = 'datetime64,a5,a5,i4'不会产生预期的 dtype:

In [36]: na_trades = np.zeros((number_of_orders,), dtype = 'datetime64,a5,a5,i4')
In [37]: na_trades
Out[37]: array([1970-01-01 00:00:00], dtype=datetime64[us])

这对我来说似乎是一个错误——尽管我可能是错的。请尝试:

na_trades = np.empty(number_of_orders,
                     dtype = [
                         ('dt', 'datetime64'),
                         ('foo','a5'),
                         ('bar', 'a5'),
                         ('baz', 'i4')])
于 2013-03-29T23:59:59.420 回答
1

这是因为在 numpy 数组(与 python 列表不同)中,您不能将序列分配给数组中的单个元素。Python 数组是非同质的(例如,不同的元素可以是不同的类型)并且并不真正关心你放入其中的内容,而 Numpy 数组具有特定的类型。您正在尝试将类型设置为复合类型(例如,带有一个datetime、两个字符串和一个 int 的东西)但是 numpy 忽略了datetime64dtype 字符串中的所有内容,因为您的语法有点偏离。

尝试以下操作:

z = np.zeros((5,), dtype = np.dtype([('time','datetime64'),('year','a5'),('month','a5'),('day','i4')]))

这将创建一个numpy.void类似于字典的类型。例如,您可以执行以下操作:

>>> z[0]
(datetime.datetime(1970, 1, 1, 0, 0), '', '', 0)

>>> z[0]['time']
1970-01-01 00:00:00

>>> z[0][0]
1970-01-01 00:00:00
于 2013-03-30T00:01:26.713 回答