将字符串转换为 Numpy 日期时间

Converting string to Numpy datetime

我使用的是 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')

是的,您在 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 循环更好(对于较大的列表可能需要一些时间)。如果您必须拥有如此复杂的数组,用 class 处理它或者让不同的多个数组每个保存自己的数据不是更容易吗?

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