将numpy数组转换为日期时间列表

6

我有一个日期的二维数组,形式如下:

[Y Y Y ... ]
[M M M ... ]
[D D D ... ]
[H H H ... ]
[M M M ... ]
[S S S ... ]

所以看起来
data = np.array([
    [2015, 2015, 2015, 2015, 2015, 2015], # ...
    [   1,    1,    1,    1,    1,    1],
    [   1,    1,    1,    2,    2,    2],
    [  23,   23,   23,    0,    0,    0],
    [   4,    5,    5,   37,   37,   37],
    [  59,    1,    2,   25,   27,   29]
])

什么是将这个转换为一个日期时间对象列表的最佳方法?

你可以同时使用 Pandas,还是只需要纯粹地使用 NumPy 数组? - Zeugma
还有一个后续问题 - 是否可以在不通过 datetime.datetime 回传的情况下完成,并生成 np.datetime64np.array - Eric
@Boud,请详细说明一下pandas在这里如何帮助。 - SDsolar
2个回答

6
import datetime
import numpy as np

data = np.array(
    [[2015, 2015, 2015, 2015, 2015, 2015],
     [   1,    1,    1,    1,    1,    1],
     [   1,    1,    1,    2,    2,    2],
     [  23,   23,   23,    0,    0,    0],
     [   4,    5,    5,   37,   37,   37],
     [  59,    1,    2,   25,   27,   29]]
)

# Transpose the data so that columns become rows.
data = data.T

# A simple list comprehension does the trick, '*' making sure
# the values are unpacked for 'datetime.datetime'.
new_data = [datetime.datetime(*x) for x in data]

print(new_data)

[datetime.datetime(2015年1月1日23时4分59秒), datetime.datetime(2015年1月1日23时5分1秒), datetime.datetime(2015年1月1日23时5分2秒), datetime.datetime(2015年1月2日0时37分25秒), datetime.datetime(2015年1月2日0时37分27秒), datetime.datetime(2015年1月2日0时37分29秒)]

点个赞。我正在尝试将datetime.date连接到datetime对象。(很明显,我使用from datetime import datetime使代码更易读) 很高兴知道这种方法可行;我从未在文档中看到过这种用法。 - SDsolar

0
如果你想要使用np.datetime64对象,那么可以这样做:
import functools

units = 'YMDhms'
first_vals = np.array([1970, 1, 1, 0, 0, 0])
epoch = np.datetime64('1970')

results = functools.reduce(
    np.add,
    [
        d.astype('timedelta64[{}]'.format(unit))
        for d, unit in zip(data - first_vals[:,np.newaxis], units)
    ],
    epoch
)

这将会给出:

array(['2015-01-01T23:04:59',
       '2015-01-01T23:05:01',
       '2015-01-01T23:05:02',
       '2015-01-02T00:37:25',
       '2015-01-02T00:37:27',
       '2015-01-02T00:37:29'], dtype='datetime64[s]')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接