如何将 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 之间转换
如何将 csv 文件读取为 dtype datetime64?