当前位置: 首页 > 面试题库 >

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

公羊光明
2023-03-14
问题内容

如何将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)…


问题答案:

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

上面的html" target="_blank">示例假定原始日期时间对象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的可能改变。



 类似资料:
  • 问题内容: 根据http://dev.mysql.com/doc/refman/5.0/en/datetime.html。我找到了一种将字符串值’YYYY- MM-DD HH:MM:SS’转换为时间戳int的方法。 我在python的文档中查找。 我试过了: python给我这样的结果。 time.struct_time(tm_year = 2013,tm_mon = 1,tm_mday = 12

  • 问题内容: 我试图在 Joda中 更改by 的值: __ 对于,值是: 对于,值是: 没有时区差异。 如何使用TimeZone获取正确的时间戳? 例如,我想获取“ 2013-05-13 01:56:27.0”。 提前致谢。 编辑: 使用 MySQL ,列类型当然是。 问题答案: 实际上,这不是一个重复的问题。这是我几次后解决我的问题的方式: 这是从所需时区获取偏移的方法。 回到代码,我们从查询的结

  • 问题内容: 我需要将 时间 和 日期 都存储在mysql中。所以我使用了函数。但是我不知道我应该为phpmyadmin 类型列 使用什么。应该注意的是,返回时间和日期都是这样的: 这是一个解决方案,我可以使用分隔符来分隔日期和时间(和),然后将它们分别存储在DATE类型和TIME类型中。或者,我可以使用VARCHAR类型将它们都存储在一列中。但是我认为这些方法不是标准的。存储日期和时间的标准类型是

  • 问题内容: I have dataframe and column with dates looks like I use to convert that, but I’m get strange result Maybe I did anything wrong 问题答案: This looks look epoch timestamps which is number of seconds s

  • 问题内容: 我想将datetime数组传递给Numba函数(无法向量化,否则会很慢)。我了解Numba支持numpy.datetime64。但是,它似乎支持datetime64 [D](日期精度),但不支持datetime64 [ns](毫秒精度)(我很难学到:是否已记录?)。 我试图将datetime64 [ns]转换为datetime64 [D],但似乎找不到方法!有任何想法吗? 我用下面的最

  • 问题内容: 在Java 8和Java 8 之间进行转换的最佳方法是什么? 问题答案: 从转换为: 转换回来比较简单: