numpy.array.tolist() 将 numpy.datetime64 转换为 int

Ror*_*ule 5 python arrays datetime types numpy

我有一个日期时间数组,需要将其转换为日期时间列表。我的数组如下所示:

import numpy as np

my_array = np.array(['2017-06-28T22:47:51.213500000', '2017-06-28T22:48:37.570900000',
                     '2017-06-28T22:49:46.736800000', '2017-06-28T22:50:41.866800000',
                     '2017-06-28T22:51:17.024100000', '2017-06-28T22:51:24.038300000'], dtype='datetime64[ns]')

my_list = my_array.tolist()
Run Code Online (Sandbox Code Playgroud)

我需要一个日期时间值列表,但是当我这样做时my_array.tolist(),我会得到一个数字时间戳列表:

[1498690071213500000,
 1498690117570900000,
 1498690186736800000,
 1498690241866800000,
 1498690277024100000,
 1498690284038300000]
Run Code Online (Sandbox Code Playgroud)

我的问题是从数组转换为列表时如何保留日期时间格式,或者如何将时间戳列表转换为列表日期时间值

War*_*ser 8

NumPy 无法将 的实例转换'datetime64[ns]'为 Pythondatetime.datetime实例,因为datetime实例不支持纳秒分辨率。

如果将数组转换为'datetime64[us]',因此时间戳只有微秒分辨率,那么该.tolist()方法将为您提供datetime.datetime实例:

In [25]: my_array
Out[25]: 
array(['2017-06-28T22:47:51.213500000', '2017-06-28T22:48:37.570900000',
       '2017-06-28T22:49:46.736800000', '2017-06-28T22:50:41.866800000',
       '2017-06-28T22:51:17.024100000', '2017-06-28T22:51:24.038300000'],
      dtype='datetime64[ns]')

In [26]: my_array.astype('datetime64[us]').tolist()
Out[26]: 
[datetime.datetime(2017, 6, 28, 22, 47, 51, 213500),
 datetime.datetime(2017, 6, 28, 22, 48, 37, 570900),
 datetime.datetime(2017, 6, 28, 22, 49, 46, 736800),
 datetime.datetime(2017, 6, 28, 22, 50, 41, 866800),
 datetime.datetime(2017, 6, 28, 22, 51, 17, 24100),
 datetime.datetime(2017, 6, 28, 22, 51, 24, 38300)]
Run Code Online (Sandbox Code Playgroud)


Eri*_*erd 3

显式转换numpy.ndarray为原生 Pythonlist会将内容保留为numpy.datetime64对象:

>>> list(my_array)
[numpy.datetime64('2017-06-28T22:47:51.213500000'),
 numpy.datetime64('2017-06-28T22:48:37.570900000'),
 numpy.datetime64('2017-06-28T22:49:46.736800000'),
 numpy.datetime64('2017-06-28T22:50:41.866800000'),
 numpy.datetime64('2017-06-28T22:51:17.024100000'),
 numpy.datetime64('2017-06-28T22:51:24.038300000')]
Run Code Online (Sandbox Code Playgroud)

但是,如果您想从整数时间戳返回到对象numpy.datetime64,则此处给出的数字numpy.ndarray.tolist以纳秒格式给出,因此您也可以使用如下列表理解:

>>> [np.datetime64(x, "ns") for x in my_list]
[numpy.datetime64('2017-06-28T22:47:51.213500000'),
 numpy.datetime64('2017-06-28T22:48:37.570900000'),
 numpy.datetime64('2017-06-28T22:49:46.736800000'),
 numpy.datetime64('2017-06-28T22:50:41.866800000'),
 numpy.datetime64('2017-06-28T22:51:17.024100000'),
 numpy.datetime64('2017-06-28T22:51:24.038300000')]
Run Code Online (Sandbox Code Playgroud)

如果您希望最终结果为 Pythondatetime.datetime对象而不是numpy.datetime64对象,则可以使用如下方法(根据局部性需要进行调整):

>>> from datetime import datetime
>>> list(map(datetime.utcfromtimestamp, my_array.astype(np.uint64) / 1e9))
[datetime.datetime(2017, 6, 28, 22, 47, 51, 213500),
 datetime.datetime(2017, 6, 28, 22, 48, 37, 570900),
 datetime.datetime(2017, 6, 28, 22, 49, 46, 736800),
 datetime.datetime(2017, 6, 28, 22, 50, 41, 866800),
 datetime.datetime(2017, 6, 28, 22, 51, 17, 24100),
 datetime.datetime(2017, 6, 28, 22, 51, 24, 38300)]
Run Code Online (Sandbox Code Playgroud)

编辑: Warren Weckesser 的答案提供了一种比此处描述的更直接的方法来从numpy.datetime64[ns]数组转换为 Python 对象列表。datetime.datetime