Python NumPy - 将时间戳转换为日期时间

3

我有一个如下的np数组:

example = np.array([[Timestamp('2005-03-06 17:00:00'), 1225.75, 1226.25, 1225.0, 1225.5,
        1668.0],
       [Timestamp('2005-03-06 17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0,
        1603.0],
       [Timestamp('2005-03-06 18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25,
        590.0]], dtype=object)

第一列是时间戳类型的值。 我该如何将这些值转换为日期时间? 我知道有几个类似的问题,但我无法清楚地理解它们并找出一个干净整洁的解决方案。

我可以使用example[0,0].to_datetime()将单个值的时间戳转换为日期时间,但如何同时对所有时间戳进行操作?最好像example[:,0].这样的东西...


在你的“示例”中,未定义“Timestamp”。你能澄清一下吗? - Joe T. Boka
我的意思是,我想将像 Timestamp('2005-03-06 18:00:00') 这样的值转换为 datetime.datetime(2005, 3, 6, 17, 0) 这样的值。 - jim jarnac
2
我认为@JoeT.Boka所问的是“你从哪里得到了Timestamp类?”,如果我错了请纠正我。 - Dekel
这个数组是从一个Pandas DataFrame转换而来的(example = df.as_matrix())。据我所了解,在DataFrame本身内部无法将Pandas Timestamp转换为datetime。 - jim jarnac
3个回答

3

如果我将Timestamp定义为numpy时间日期数据类型:

In [43]: Timestamp=np.datetime64

那么我可以复制粘贴您的示例

In [44]: example = np.array([[Timestamp('2005-03-06 17:00:00'), 1225.75, 1226.25 , 1225.0, 1225.5, 1668.0],
    ...:        [Timestamp('2005-03-06 17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0,         1603.0],
    ...:        [Timestamp('2005-03-06 18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], dtype=object)

注意,此数组的dtypeobject
In [45]: example
Out[45]: 
array([[numpy.datetime64('2005-03-06T17:00:00'), 1225.75, 1226.25, 1225.0,1225.5, 1668.0],
       [numpy.datetime64('2005-03-06T17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0, 1603.0],
       [numpy.datetime64('2005-03-06T18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], dtype=object)

第一列是:
In [46]: example[:,0]
Out[46]: 
array([numpy.datetime64('2005-03-06T17:00:00'),
       numpy.datetime64('2005-03-06T17:30:00'),
       numpy.datetime64('2005-03-06T18:00:00')], dtype=object)

这可以转换为一个datetime64元素的数组:

In [47]: example[:,0].astype(np.datetime64)
Out[47]: array(['2005-03-06T17:00:00', '2005-03-06T17:30:00', '2005-03-06T18:00:00'], dtype='datetime64[s]')

tolist 用于此类型的数组,将元素转换为 datetime 对象:

In [48]: example[:,0].astype(np.datetime64).tolist()
Out[48]: 
[datetime.datetime(2005, 3, 6, 17, 0),
 datetime.datetime(2005, 3, 6, 17, 30),
 datetime.datetime(2005, 3, 6, 18, 0)]

或者,调用 pandas.Timestamp 函数

In [50]: Timestamp = pd.Timestamp

In [52]: example
Out[52]: 
array([[Timestamp('2005-03-06 17:00:00'), 1225.75, 1226.25, 1225.0, 1225.5, 1668.0],
       [Timestamp('2005-03-06 17:30:00'), 1225.75, 1227.5, 1225.75, 1227.0,  1603.0],
       [Timestamp('2005-03-06 18:00:00'), 1227.0, 1227.5, 1226.75, 1227.25,  590.0]], dtype=object)

In [64]: ts = example[:,0]
In [65]: ts
Out[65]: 
array([Timestamp('2005-03-06 17:00:00'), Timestamp('2005-03-06 17:30:00'), Timestamp('2005-03-06 18:00:00')], dtype=object)

时间戳对象的迭代转换

In [67]: np.array([t.to_datetime() for t in ts])
Out[67]: 
array([datetime.datetime(2005, 3, 6, 17, 0),
       datetime.datetime(2005, 3, 6, 17, 30),
       datetime.datetime(2005, 3, 6, 18, 0)], dtype=object)

但是我发现 astype 可以与 Timestamp 对象一起使用:

In [73]: ts = example[:,0]
In [74]: ts.astype('datetime64[s]')
Out[74]: array(['2005-03-06T17:00:00', '2005-03-06T17:30:00', '2005-03-06T18:00:00'], dtype='datetime64[s]')

所以我可以使用tolist在一行中完成转换:
In [75]: ts.astype('datetime64[s]').tolist()
Out[75]: 
[datetime.datetime(2005, 3, 6, 17, 0),
 datetime.datetime(2005, 3, 6, 17, 30),
 datetime.datetime(2005, 3, 6, 18, 0)]

我不会将这描述为最终解决方案,但它可以让您了解numpy如何处理日期。

对于数组数学,我建议使用datetime64数据类型。要与example[:,1:]浮点数保持在一个数组中,您必须使用结构化数组。

=================

尝试复制:

In [80]: ex1 = example.copy()

In [82]: ex1[:,0] = example[:,0].astype('datetime64[s]').tolist()
In [83]: ex1
Out[83]: 
array([[datetime.datetime(2005, 3, 6, 17, 0), 1225.75, 1226.25, 1225.0, 1225.5, 1668.0],
       [datetime.datetime(2005, 3, 6, 17, 30), 1225.75, 1227.5, 1225.75, 1227.0, 1603.0],
       [datetime.datetime(2005, 3, 6, 18, 0), 1227.0, 1227.5, 1226.75, 1227.25, 590.0]], 
      dtype=object)

谢谢,这非常有用且易于理解。您是否有什么提示,可以将时间戳转换为日期时间并保留在原始数组中?根据您的示例,我只剩下一个包含时间戳的数组。我知道这是我的建议,但最终目标当然是将简单的时间序列(即原始“示例”)与其时间戳转换。我必须这样做的原因是Matplotlib图表。 - jim jarnac
看起来我可以将那些 tolist() 的结果直接复制回原始数组。由于 dtype 是对象,它并不关心元素的类型是否改变。 - hpaulj

2

Helo, try:

example[:,0]= map(lambda x: x.to_datetime(), example[:,0])

1
我喜欢这种语法,因为 to_datetime 很明确地说明了正在发生的事情。然而,当使用你的那行代码时,以下内容包含在变量 example 中:array([[<map object at 0x7ff675634940>, 1207.5, 1209.75, 1207.25, 1209.0, 7659.0], 你可以看到在应该是 datetime.datetime 的地方有一个 "map object"。抱歉我还不熟悉 Pandas 等工具。但是我是否忽略了什么? - jim jarnac
哦,我明白了,你在使用Python 3吗?尝试在map之前添加一个列表,如:list(map(...)) - maininformer

0

这很简单:

t = np.datetime64('2018-08-18 23:25') --> numpy.datetime64('2018-06-18T23:31')

t.\_\_str\_\_() --> '2018-06-18T23:31'

t.tolist() --> datetime.datetime(2018, 6, 18, 23, 31)

这就是你所需要的全部内容。


Timestamp 不总是 np.datetime64 - undefined

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