我正在使用numpy 1.8.2,以下代码导致以下错误:
import numpy as np
data = []
data.append(['2015-01-03 05:00:00', 5, 5.01])
data.append(['2015-01-04 05:00:00', 7, 7.01])
data.append(['2015-01-05 05:00:00', 8, 8.01])
data.append(['2015-01-06 05:00:00', 10, 10.01])
dt = np.dtype('M8', '<f8', '<f8')
np.array(data, dtype=dt)
产生以下输出:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-24-a3d77026bff9> in <module>()
9 dt = np.dtype('M8', '<f8', '<f8')
10
---> 11 np.array(data, dtype=dt)
ValueError: Could not convert object to NumPy datetime
我有什么问题吗?
我特别困惑,因为
np.datetime64('2015-01-06 05:00:00')
产生预期的输出:
numpy.datetime64('2015-01-06T05:00:00-0500')
答案 0 :(得分:0)
是的,您在data
列表中发送的内容实际上是:
>>> data[0]
['2015-01-03 05:00:00', 5, 5.01]
但您正在测试转换的是:
'2015-01-03 05:00:00'
一个是字符串,另一个是列表。据我所知,Numpy不在列表中。 Bellow代码证明了这些差异。
data = []
data.append('2015-01-03 05:00:00')
data.append('2015-01-04 05:00:00')
data.append('2015-01-05 05:00:00')
np.array(data, dtype=dt)
#output
array(['2015-01-03T05:00:00+0100', '2015-01-04T05:00:00+0100',
'2015-01-05T05:00:00+0100'], dtype='datetime64[s]')
让代码工作的方法是只转换每个列表的第一个元素,然后将其附加到列表日期。
for i in range(len(data)):
date = np.array(data[i][0], dtype=dt)
data[i][0] = date
这可以比for循环更好(对于更大的列表可能需要一些时间)。如果你必须拥有这样一个复杂的数组,是不是更容易用类来处理它,或者有不同的多个数组,每个数组都拥有它自己的数据?
>>> data
[[array(datetime.datetime(2015, 1, 3, 4, 0), dtype='datetime64[s]'), 5, 5.01],
[array(datetime.datetime(2015, 1, 4, 4, 0), dtype='datetime64[s]'), 7, 7.01],
[array(datetime.datetime(2015, 1, 5, 4, 0), dtype='datetime64[s]'), 8, 8.01],
[array(datetime.datetime(2015, 1, 6, 4, 0), dtype='datetime64[s]'), 10, 10.01]]
您从列表列表开始,然后获得了一个数组列表。如果您还执行了np.asarray(data)
这次不会导致错误,您可以选择获取一个数组数组。
我还应该提一下,正如我所看到的那样,np.dtype
主要用于描述阵列轮廓。我认为您的想法是首先声明np.dtype
,然后定义np.array
并将其类型设置为np.dtype
。这提供了一种描述您自己的数组的方法,而不是像您想要的那样隐式转换它们。它帮助np.arrays
表现为dicts
,以帮助编码人员编写更清晰明确的代码,而无需其他人不知道其含义的许多索引。看一下教程示例:
dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)
x[1]
#output:
('John', [6.0, 7.0])
x[1]['grades']
#output
array([ 6., 7.])