首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在datetime、Timestamp和datetime64之间转换

在datetime、Timestamp和datetime64之间转换
EN

Stack Overflow用户
提问于 2012-12-04 21:08:30
回答 10查看 583K关注 0票数 376

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

在下面的代码中,我创建了datetime、timestamp和datetime64对象。

代码语言:javascript
复制
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')

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

代码语言:javascript
复制
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

但是我们如何从numpy.datetime64 (dt64)中提取datetimeTimestamp呢?

更新:在我的数据集中有一个有点令人讨厌的例子(也许是鼓舞人心的例子),似乎是:

代码语言:javascript
复制
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

它应该是datetime.datetime(2002, 6, 28, 1, 0),而不是一个长的(!) (1025222400000000000L)...

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-12-04 21:42:08

numpy-1.8上将numpy.datetime64转换为表示时间的datetime对象

代码语言:javascript
复制
>>> 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),请执行以下操作:

代码语言:javascript
复制
>>> 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对象之间进行转换。

你的“讨厌的例子”工作正常:

代码语言:javascript
复制
>>> 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值:

代码语言:javascript
复制
pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev

同样的例子:

代码语言:javascript
复制
>>> 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对象,您可以:

代码语言:javascript
复制
>>> 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,请执行以下操作:

代码语言:javascript
复制
>>> 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版本中可能会发生变化。

票数 167
EN

Stack Overflow用户

发布于 2014-02-21 02:17:06

您可以只使用pd.Timestamp构造函数。下图可能对解决此问题和相关问题很有用。

票数 252
EN

Stack Overflow用户

发布于 2012-12-07 06:40:22

欢迎来到地狱。

您可以只将datetime64对象传递给pandas.Timestamp

代码语言:javascript
复制
In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>

我注意到这在NumPy 1.6.1中不能正常工作:

代码语言:javascript
复制
numpy.datetime64('2012-05-01T01:00:00.000000+0100')

此外,还可以使用pandas.to_datetime (这不是开发版本,还没有检查v0.9.1):

代码语言:javascript
复制
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))
票数 173
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13703720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档