数据类型 'datetime64[ns]' 和 '<M8[ns]' 之间的区别?
Difference between data type 'datetime64[ns]' and '<M8[ns]'?
我在 pandas 中创建了一个时间序列:
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]'
两种类型有什么区别?
为什么我得到的是不同的类型?
datetime64[ns]
是通用数据类型,而 <M8[ns]
是特定数据类型。一般 dtypes 映射到特定 dtypes,但可能与 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]
取决于机器的字节顺序。
还有许多其他类似的通用数据类型映射到特定数据类型的例子:
int64
映射到 <i8
或 >i8
,int
映射到 int32
或 int64
取决于 OS 的位架构以及 NumPy 的编译方式。
显然,自本书编写以来,datetime64 dtype 的 repr 发生了变化,以显示 dtype 的字节顺序。
一些背景知识将有助于理解输出的细微差别。
Numpy 具有复杂的数据类型层次结构。类型信息作为属性存储在数据类型对象中,该对象是 numpy.dtype
class 的一个实例。它描述了与数组项对应的固定大小内存块中的字节应如何解释(字节顺序、字节数等)。
创建 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]')
检查属性
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
repr
和 str
是对象的字符串表示形式,对于相同的基础数据类型,每个都可以有不同的输出。
In [9]: repr(dt.dtype)
Out[9]: "dtype('<M8[ns]')"
In [10]: str(dt.dtype)
Out[10]: 'datetime64[ns]'
一个应用程序(shell、控制台、调试器等)可能会调用它们中的任何一个,因此同一类型的输出可能看起来不同。
尽管如此令人困惑,但在位宽、类型别名等方面仍有更多细微差别。请参阅 Data types in Python, Numpy and Pandas 了解详细信息。
我在 pandas 中创建了一个时间序列:
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]'
两种类型有什么区别?
为什么我得到的是不同的类型?
datetime64[ns]
是通用数据类型,而 <M8[ns]
是特定数据类型。一般 dtypes 映射到特定 dtypes,但可能与 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]
取决于机器的字节顺序。
还有许多其他类似的通用数据类型映射到特定数据类型的例子:
int64
映射到 <i8
或 >i8
,int
映射到 int32
或 int64
取决于 OS 的位架构以及 NumPy 的编译方式。
显然,自本书编写以来,datetime64 dtype 的 repr 发生了变化,以显示 dtype 的字节顺序。
一些背景知识将有助于理解输出的细微差别。
Numpy 具有复杂的数据类型层次结构。类型信息作为属性存储在数据类型对象中,该对象是 numpy.dtype
class 的一个实例。它描述了与数组项对应的固定大小内存块中的字节应如何解释(字节顺序、字节数等)。
创建 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]')
检查属性
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
repr
和 str
是对象的字符串表示形式,对于相同的基础数据类型,每个都可以有不同的输出。
In [9]: repr(dt.dtype)
Out[9]: "dtype('<M8[ns]')"
In [10]: str(dt.dtype)
Out[10]: 'datetime64[ns]'
一个应用程序(shell、控制台、调试器等)可能会调用它们中的任何一个,因此同一类型的输出可能看起来不同。
尽管如此令人困惑,但在位宽、类型别名等方面仍有更多细微差别。请参阅 Data types in Python, Numpy and Pandas 了解详细信息。