数据类型“ datetime64 [ns]”和“ <M8 [ns]”之间的区别?


75

我在熊猫中创建了一个TimeSeries:

In [346]: from datetime import datetime

In [347]: dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7),

 .....: datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)]

In [348]: ts = Series(np.random.randn(6), index=dates)

In [349]: ts

Out[349]: 

2011-01-02 0.690002

2011-01-05 1.001543

2011-01-07 -0.503087

2011-01-08 -0.622274

2011-01-10 -0.921169

2011-01-12 -0.726213

我关注的是“ Python for Data Analysis”一书中的示例。

在下面的段落中,作者检查索引类型:

In [353]: ts.index.dtype

Out[353]: dtype('datetime64[ns]')

当我在控制台中执行完全相同的操作时,我得到:

ts.index.dtype
dtype('<M8[ns]')

两种类型'datetime64[ns]'和和有'<M8[ns]'什么区别?

为什么我得到不同的类型?


我无法回答这个问题,但是请记住,这本书大约有3年历史了(因此是基于较早版本的熊猫),因此发现这样的差异是很普遍的(尤其是对于索引和日期时间的东西),尽管大多数示例还是差不多。
JohnE

针对时间序列数据的DataCamp课程机器学习的练习中遇到相同的问题,导致TypeError: ufunc subtract cannot use operands with types dtype('<M8[ns]') and dtype('float64')
Morten Engelsmann

Answers:


128

datetime64[ns]是通用dtype,<M8[ns]而是特定dtype。常规dtype映射到特定dtype,但与从NumPy的一个安装到下一个安装可能有所不同。

在字节顺序为Little Endian的机器上,np.dtype('datetime64[ns]')和之间没有区别 np.dtype('<M8[ns]')

In [6]: np.dtype('datetime64[ns]') == np.dtype('<M8[ns]')
Out[6]: True

但是,在大端机上,np.dtype('datetime64[ns]')将等于np.dtype('>M8[ns]')

因此,datetime64[ns]映射到<M8[ns]>M8[ns]取决于机器的字节序。

通用dtypes映射到特定dtypes还有许多其他类似的示例: int64映射到<i8>i8,并int映射到int32或,int64 取决于OS的位体系结构以及NumPy的编译方式。


显然,自从编写本书开始显示dtype的字节序以来,datetime64 dtype的代表就发生了变化。


尽管我可以重现@unutbu的对比测试,我得到了TypeError4年提到本书写完后。
Morten Engelsmann

-21

如果这在运行代码时产生错误,则同步升级pandas和numpy可能会解决datetime数据类型中的冲突。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.