如何将numpy.datetime64
对象转换为datetime.datetime
(或Timestamp
)?
在下面的代码中,我创建一个datetime,timestamp和datetime64对象。
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
(Timestamp
)中提取numpy.datetime64
或dt64
?。
更新:我的数据集中的一个令人讨厌的例子(也许是激励性的例子)似乎是:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
应该是
datetime.datetime(2002, 6, 28, 1, 0)
,而不是长(!)(1025222400000000000L
)... 最佳答案
要将numpy.datetime64
转换为代表numpy-1.8
上UTC时间的datetime对象:
>>> 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
将朴素的datetime对象解释为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
,因为对于numpy.datetime64
类型.astype(datetime)
等效于.astype(object)
,它在long
上返回Python整数(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 docs表示datetime API是实验性的,在将来的numpy版本中可能会更改。
关于python - 在datetime,Timestamp和datetime64之间转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13703720/