1. ホーム
  2. python

[解決済み] データ型「datetime64[ns]」と「<M8[ns]」との違い?

2022-01-29 23:14:15

質問内容

pandasで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]')

2つのタイプの違いは何ですか? 'datetime64[ns]''<M8[ns]' ?

また、なぜ違うタイプが表示されるのですか?

解決方法は?

datetime64[ns] は一般的なデータ型であるのに対し <M8[ns] は特定のデータ型です。一般的な型は特定の型に対応するが、NumPyのインストールごとに異なる可能性がある。

バイトオーダーがリトルエンディアンのマシン上では、以下のような違いはありません。 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 のコンパイル方法に依存する。


どうやら、この本が書かれた当時から、datetime64というd型のエンディアン性を示すreprが変更されているようです。