如何将 numpy datetime64 转换为 datetime [重复]

Posted

技术标签:

【中文标题】如何将 numpy datetime64 转换为 datetime [重复]【英文标题】:How to convert numpy datetime64 into datetime [duplicate] 【发布时间】:2015-06-27 11:36:54 【问题描述】:

我基本上遇到了这里发布的同样问题:Converting between datetime, Timestamp and datetime64

但我找不到满意的答案,我的问题是如何从 numpy.datetime64 类型中提取日期时间:

如果我尝试:

np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)

它给了我: 1339999205453000000L

我当前的解决方案是将 datetime64 转换为字符串,然后再次转换为 datetime。但这似乎是一种很愚蠢的方法。

【问题讨论】:

L 的值与您从 .tolist() 获得的值相同 我从test 文件中发现,dtype 'M8[ms]' 很容易转换为datetime 阅读my answer to the end 了吗?您是否注意到不同的 numpy 版本在这里表现不同?答案包含不同numpy 版本的代码(版本是明确指定的)。甚至还有产生long 数字的代码示例,然后在这种情况下展示如何获取datetime 很抱歉,原始答案和这个答案都令人困惑。似乎有很多不同的方法可以做到这一点,我仍然不清楚如何将 numpy 日期时间转换为 pandas 日期时间的问题。例如,我不清楚下面的解决方案是否在说:pdDateTime = datetime.datetime.utcfromtimestamp(x.tolist()/1e9) ?? 【参考方案1】:

从 Converting between datetime, Timestamp and datetime64

In [220]: x
Out[220]: numpy.datetime64('2012-06-17T23:00:05.453000000-0700')

In [221]: datetime.datetime.utcfromtimestamp(x.tolist()/1e9)
Out[221]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999)

考虑时区我认为这是正确的。不过看起来很笨重。

使用int() tolist()) 更明确(我认为):

In [294]: datetime.datetime.utcfromtimestamp(int(x)/1e9)
Out[294]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999)

或获取本地日期时间:

In [295]: datetime.datetime.fromtimestamp(x.astype('O')/1e9)

但在test_datatime.py 文件中 https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_datetime.py

我找到了一些其他选项 - 首先将通用 datetime64 转换为指定单位的格式之一:

In [296]: x.astype('M8[D]').astype('O')
Out[296]: datetime.date(2012, 6, 18)

In [297]: x.astype('M8[ms]').astype('O')
Out[297]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

这适用于数组:

In [303]: np.array([[x,x],[x,x]],dtype='M8[ms]').astype('O')[0,1]
Out[303]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

【讨论】:

见my comment to @eumiro's answer (that you've borrowed from)。 所以long是单位为[ns]的结果 谢谢。太棒了。 乍一看,我认为x.tolist()/1e9 是一个错误,因为我没有注意到x 在你的情况下是一个标量。我强烈建议将其替换为x.item() 以澄清。【参考方案2】:

请注意,Timestamp 是 datetime.datetime 的子类,因此 [4] 通常可以工作

In [4]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400'))
Out[4]: Timestamp('2012-06-18 06:00:05.453000')

In [5]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400')).to_pydatetime()
Out[5]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

【讨论】:

见@Wes McKinney's answer Wes 描述的错误已在很久以前修复 我的意思是你已经使用了没有署名的答案 哦,我没有意识到他有一个针对这个确切主题的 - 所以注意到了 "This exact topic" 在问题中已链接。 At the very least you should have read existing answers in the link 在回答之前。

以上是关于如何将 numpy datetime64 转换为 datetime [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python numpy:无法将 datetime64[ns] 转换为 datetime64[D](与 Numba 一起使用)

在 datetime、Timestamp 和 datetime64 之间转换

008.Numpy日期时间和增量

如何将 csv 文件读取为 dtype datetime64?

Python/Pandas:如何从 datetime64[ns] 转换为 datetime

在 pyspark 中的 datetime64 和 datetime 之间转换