0

我正在使用 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')
4

1 回答 1

1

是的,您在data列表中发送的内容实际上是这样的:

>>> data[0]
['2015-01-03 05:00:00', 5, 5.01]

但是你正在测试你的转换是这样的:

'2015-01-03 05:00:00'

一个是字符串,另一个是列表。据我所知,Numpy 不会查看列表。波纹管代码演示了这些差异。

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正如我所看到的那样,它主要用于描述数组轮廓。我相信这个想法是您应该首先声明 anp.dtype然后定义 annp.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.])
于 2015-02-27T17:23:28.807 回答