如何将numpy datetime64转换为datetime

时间:2015-04-20 16:14:16

标签: python datetime numpy pandas

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

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

如果我尝试:

np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)
它给了我:      1339999205453000000L

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

2 个答案:

答案 0 :(得分:14)

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

时区会计我认为是对的。看起来相当笨拙。

astype('O') is better (I think) than tolist())`:

In [294]: datetime.datetime.utcfromtimestamp(x.astype('O')/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)

答案 1 :(得分:7)

请注意,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)