如何将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)
但是我们如何从numpy.datetime64
(dt64
)中提取datetime
或Timestamp
呢?
。
更新:在我的数据集中有一个有点令人讨厌的例子(也许是鼓舞人心的例子),似乎是:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
它应该是datetime.datetime(2002, 6, 28, 1, 0)
,而不是一个长的(!) (1025222400000000000L
)...
发布于 2012-12-04 21:42:08
在numpy-1.8
上将numpy.datetime64
转换为表示时间的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.int8、np.int16等一样思考np.datetime64,并应用相同的方法在np.int8、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
我可以在安装为以下代码的numpy-1.8.0
上重现long
值:
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)
等同于在numpy-1.8
上返回Python整数(long
)的.astype(object)
。
要获取datetime对象,您可以:
>>> 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版本中可能会发生变化。
发布于 2014-02-21 02:17:06
您可以只使用pd.Timestamp构造函数。下图可能对解决此问题和相关问题很有用。
发布于 2012-12-07 06:40:22
欢迎来到地狱。
您可以只将datetime64对象传递给pandas.Timestamp
In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>
我注意到这在NumPy 1.6.1中不能正常工作:
numpy.datetime64('2012-05-01T01:00:00.000000+0100')
此外,还可以使用pandas.to_datetime
(这不是开发版本,还没有检查v0.9.1):
In [24]: pandas.to_datetime('2012-05-01T01:00:00.000000+0100')
Out[24]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))
https://stackoverflow.com/questions/13703720
复制相似问题