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

LLa*_*LaP 52 python numpy pandas datetime64

我在熊猫中创建了一个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
Run Code Online (Sandbox Code Playgroud)

我正在关注"Python for Data Analysis"一书中的示例.

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

In [353]: ts.index.dtype

Out[353]: dtype('datetime64[ns]')
Run Code Online (Sandbox Code Playgroud)

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

ts.index.dtype
dtype('<M8[ns]')
Run Code Online (Sandbox Code Playgroud)

什么是两种类型之间的区别'datetime64[ns]''<M8[ns]'

为什么我会得到另一种类型?

unu*_*tbu 83

datetime64[ns]是一般的dtype,<M8[ns]而是特定的dtype.常规dtypes映射到特定的dtypes,但可能与NumPy的一个安装不同.

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

In [6]: np.dtype('datetime64[ns]') == np.dtype('<M8[ns]')
Out[6]: True
Run Code Online (Sandbox Code Playgroud)

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

因此datetime64[ns]映射到任一<M8[ns]>M8[ns]取决于机器的endian-ness.

还有许多其他类似的一般dtypes映射到特定dtypes的示例: int64映射到<i8>i8,int映射到int32或者int64 取决于操作系统的位体系结构以及如何编译NumPy.


显然,datetime64 dtype的repr自编写本书以来显示dtype的endian-ness已经发生了变化.


ap-*_*osd 23

一些背景知识将有助于理解输出的细微差别。

Numpy 具有复杂的数据类型层次结构。类型信息作为属性存储在数据类型对象中,该对象是numpy.dtype类的实例。它描述了如何解释与数组项相对应的固定大小内存块中的字节(字节顺序、字节数等)。

创建一个实例dtype

In [1]: import numpy as np

In [2]: dt = np.datetime64('1980', 'ns')

In [3]: dt
Out[3]: numpy.datetime64('1980-01-01T00:00:00.000000000')

In [4]: dt.dtype
Out[4]: dtype('<M8[ns]')
Run Code Online (Sandbox Code Playgroud)

检查属性

In [5]: dt.dtype.char
Out[5]: 'M'

In [6]: dt.dtype.name
Out[6]: 'datetime64[ns]'

In [7]: dt.dtype.str
Out[7]: '<M8[ns]'

In [8]: dt.dtype.type
Out[8]: numpy.datetime64

Run Code Online (Sandbox Code Playgroud)

reprstr是对象的字符串表示形式,对于相同的基础数据类型,每个都可以有不同的输出。

In [9]: repr(dt.dtype)
Out[9]: "dtype('<M8[ns]')"

In [10]: str(dt.dtype)
Out[10]: 'datetime64[ns]'
Run Code Online (Sandbox Code Playgroud)

应用程序(shell、控制台、调试器等)可以调用其中任何一个,因此对于相同类型,输出可能看起来不同。

尽管这很令人困惑,但在位宽、类型别名等方面仍然存在更多细微差别。有关详细信息,请参阅Python、Numpy 和 Pandas 中的数据类型。