将字符串转换为 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.])
我使用的是 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.])