Python-在datetime,Timestamp和datetime64之间转换

发布于 2021-02-02 23:20:47

如何将numpy.datetime64对象转换为datetime.datetime(或Timestamp)?

在下面的代码中,我创建了一个datetime,timestampdatetime64对象。

import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)

In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)

In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>

In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')

注意:很容易从时间戳获取日期时间:

In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

但是我们如何从()中提取datetime或?Timestampnumpy.datetime64dt64

更新:我的数据集中的一个令人讨厌的例子(也许是激励性的例子)似乎是:

dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

应该是datetime.datetime(2002, 6, 28, 1, 0),而不是长(!)(1025222400000000000L)…

关注者
0
被浏览
196
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    要将numpy.datetime64日期时间对象转换为代表UTC时间的日期时间对象,请执行以下操作numpy-1.8

    >>> from datetime import datetime
    >>> import numpy as np
    >>> dt = datetime.utcnow()
    >>> dt
    datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
    >>> dt64 = np.datetime64(dt)
    >>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
    >>> ts
    1354650685.3624549
    >>> datetime.utcfromtimestamp(ts)
    datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
    >>> np.__version__
    '1.8.0.dev-7b75899'
    

    上面的示例假定原始日期时间对象np.datetime64在UTC中被解释为时间。

    要将datetime转换为np.datetime64并返回(numpy-1.6):

    >>> np.datetime64(datetime.utcnow()).astype(datetime)
    datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)
    

    它既可用于单个np.datetime64对象,又可用于np.datetime64的numpy数组。

    想想np.datetime64的方式与处理np.int8,np.int16等的方式相同,并应用相同的方法在Python对象(如int,datetime和相应的numpy对象)之间转换甜菜。

    您的“讨厌的例子”可以正常工作:

    >>> from datetime import datetime
    >>> import numpy 
    >>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
    datetime.datetime(2002, 6, 28, 0, 0)
    >>> numpy.__version__
    '1.6.2' # current version available via pip install numpy
    

    我可以将安装时的long值复制numpy-1.8.0为:

    pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev
    

    相同的例子:

    >>> from datetime import datetime
    >>> import numpy
    >>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
    1025222400000000000L
    >>> numpy.__version__
    '1.8.0.dev-7b75899'
    

    它long之所以返回,是因为for numpy.datetime64类型.astype(datetime)等于在.astype(object)上返回Python整数(long)numpy-1.8。

    要获取日期时间对象,您可以:

    >>> dt64.dtype
    dtype('<M8[ns]')
    >>> ns = 1e-9 # number of seconds in a nanosecond
    >>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
    datetime.datetime(2002, 6, 28, 0, 0)
    

    要获取直接使用秒的datetime64:

    >>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
    >>> dt64.dtype
    dtype('<M8[s]')
    >>> datetime.utcfromtimestamp(dt64.astype(int))
    datetime.datetime(2002, 6, 28, 0, 0)
    

    该numpy的文档说,日期时间API是实验性的,并在未来的版本中numpy的可能改变。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看