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?
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.
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.