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

时间:2015-02-27 16:38:53

标签: python numpy datetime64

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

1 个答案:

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