我基本上面对这里发布的同样问题:Converting between datetime, Timestamp and datetime64
但是我无法从中找到令人满意的答案,我的问题是如何从numpy.datetime64类型中提取日期时间:
如果我尝试:
np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)
它给了我:
1339999205453000000L
我当前的解决方案是将datetime64转换为字符串,然后再次转到datetime。但这似乎是一种愚蠢的方法。
答案 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)