wake-up-neo.net

Unterschied zwischen Datentyp 'datetime64 [ns]' und '<M8 [ns]'?

Ich habe eine TimeSeries in Pandas erstellt:

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

Ich folge dem Beispiel aus dem Buch 'Python for Data Analysis'. 

Im folgenden Absatz überprüft der Autor den Indextyp:

In [353]: ts.index.dtype

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

Wenn ich genau dieselbe Operation in der Konsole durchführe, bekomme ich:

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

Was ist der Unterschied zwischen den beiden Typen 'datetime64[ns]' und '<M8[ns]'?

Und warum bekomme ich einen anderen Typ?

37
LLaP

datetime64[ns] ist ein allgemeiner dtype, während <M8[ns] ein bestimmter dtype ist. Allgemeine Datentypen sind bestimmten Datentypen zugeordnet, können sich jedoch von einer Installation von NumPy zur nächsten unterscheiden.

Auf einer Maschine, deren Bytereihenfolge Little Endian ist, gibt es keinen Unterschied zwischen np.dtype('datetime64[ns]') und np.dtype('<M8[ns]'):

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

Auf einer Big-Endian-Maschine würde np.dtype('datetime64[ns]') jedoch np.dtype('>M8[ns]') gleich sein.

Daher wird datetime64[ns] entweder <M8[ns] oder >M8[ns] zugeordnet, abhängig von der Endianität der Maschine.

Es gibt viele andere ähnliche Beispiele für allgemeine dtypes, die auf bestimmte dtypes abgebildet werden: int64 ordnet sich <i8 oder >i8 zu, und int ordnet entweder int32 oder int64


Offensichtlich hat sich der Repräsentant des datetime64 dtype seit der Zeit geändert, in der das Buch geschrieben wurde, um die Endianität des dtype zu zeigen.

61
unutbu

Wenn dabei Fehler beim Ausführen des Codes auftreten, ist es wahrscheinlich, dass ein synchrones Upgrade von Pandas und Numpy den Konflikt im Datetime-Datentyp löst.

0
jnPy