本文介绍了在日期时间、时间戳和日期时间 64 之间转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

在下面的代码中,我创建了一个日期时间、时间戳和 datetime64 对象.

导入日期时间将 numpy 导入为 np将熊猫导入为 pddt = datetime.datetime(2012, 5, 1)# 一种提取 Timestamp 对象的奇怪方法,肯定有更好的方法吗?ts = pd.DatetimeIndex([dt])[0]dt64 = np.datetime64(dt)在 [7] 中:dt出[7]: datetime.datetime(2012, 5, 1, 0, 0)在[8]中:ts出[8]:<时间戳:2012-05-01 00:00:00>在 [9] 中:dt64出 [9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')

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

在 [10]: ts.to_datetime()出[10]:datetime.datetime(2012, 5, 1, 0, 0)

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

.

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

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 对象:

>>>从日期时间导入日期时间>>>将 numpy 导入为 np>>>dt = datetime.utcnow()>>>dtdatetime.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')>>>ts1354650685.3624549>>>datetime.utcfromtimestamp(ts)datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)>>>np.__version__'1.8.0.dev-7b75899'

上面的例子假设一个简单的 datetime 对象被 np.datetime64 解释为 UTC 时间.

将日期时间转换为 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,并应用相同的方法在 Python 对象(如 int、datetime 和相应的 numpy 对象)之间进行转换.

你的讨厌的例子"工作正常:

>>>从日期时间导入日期时间>>>导入 numpy>>>numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)datetime.datetime(2002, 6, 28, 0, 0)>>>numpy.__version__'1.6.2' # 当前版本可通过 pip install numpy

我可以在安装为 numpy-1.8.0 上重现 long 值:

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

同样的例子:

>>>从日期时间导入日期时间>>>导入 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)numpy-1.8 上返回 Python 整数 (long).

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

>>>dt64.dtypedtype('<M8[ns]')>>>ns = 1e-9 # 一纳秒的秒数>>>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.dtypedtype('

numpy docs 说 datetime API 是实验性的,可能会改变在未来的 numpy 版本中.

How do I convert a numpy.datetime64 object to a datetime.datetime (or Timestamp)?

In the following code, I create a datetime, timestamp and datetime64 objects.

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')

Note: it's easy to get the datetime from the Timestamp:

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

But how do we extract the datetime or Timestamp from a numpy.datetime64 (dt64)?

.

Update: a somewhat nasty example in my dataset (perhaps the motivating example) seems to be:

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

which should be datetime.datetime(2002, 6, 28, 1, 0), and not a long (!) (1025222400000000000L)...

解决方案

To convert numpy.datetime64 to datetime object that represents time in UTC on 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'

The above example assumes that a naive datetime object is interpreted by np.datetime64 as time in UTC.


To convert datetime to np.datetime64 and back (numpy-1.6):

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

It works both on a single np.datetime64 object and a numpy array of np.datetime64.

Think of np.datetime64 the same way you would about np.int8, np.int16, etc and apply the same methods to convert beetween Python objects such as int, datetime and corresponding numpy objects.

Your "nasty example" works correctly:

>>> 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

I can reproduce the long value on numpy-1.8.0 installed as:

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

The same example:

>>> 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'

It returns long because for numpy.datetime64 type .astype(datetime) is equivalent to .astype(object) that returns Python integer (long) on numpy-1.8.

To get datetime object you could:

>>> 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)

To get datetime64 that uses seconds directly:

>>> 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)

The numpy docs say that the datetime API is experimental and may change in future numpy versions.

这篇关于在日期时间、时间戳和日期时间 64 之间转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-28 06:03