Wie konvertiere ich ein numpy.datetime64
Objekt in ein datetime.datetime
(oder Timestamp
)?
Im folgenden Code erstelle ich ein datetime-, timestamp- und datetime64-Objekt.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
Hinweis: Es ist einfach, die Datums- und Uhrzeitangabe aus dem Zeitstempel abzurufen:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Aber wie extrahieren wir das datetime
oder Timestamp
aus einem numpy.datetime64
( dt64
)?
.
Update: Ein etwas unangenehmes Beispiel in meinem Datensatz (vielleicht das motivierende Beispiel) scheint zu sein:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
das sollte sein datetime.datetime(2002, 6, 28, 1, 0)
, und nicht lange (!) ( 1025222400000000000L
) ...
numpy
,pandas
Versionen.pd.Timestamp(dt64).to_datetime()
. Ich bin immer noch ein wenig unzufrieden darüber, aber Wes 'ist sicherlich weniger spezifisch für mein altes Problem (und so besser für die Welt)! Nochmals vielen Dank, dass Sie sich die Zeit genommen haben, darauf zu antworten. :)Timestamp
" undTimestamp
ist einedatetime
(eine Unterklasse von) sowieso :)Antworten:
So konvertieren Sie
numpy.datetime64
in ein Datum / Uhrzeit-Objekt, das die Zeit in UTC darstelltnumpy-1.8
:Im obigen Beispiel wird davon ausgegangen, dass ein naives Datum / Uhrzeit-Objekt
np.datetime64
in UTC als Zeit interpretiert wird .So konvertieren Sie datetime in np.datetime64 und zurück (
numpy-1.6
):Es funktioniert sowohl mit einem einzelnen np.datetime64-Objekt als auch mit einem numpy-Array von np.datetime64.
Stellen Sie sich np.datetime64 genauso vor wie np.int8, np.int16 usw. und wenden Sie dieselben Methoden an, um zwischen Python-Objekten wie int, datetime und entsprechenden numpy-Objekten zu konvertieren.
Dein "böses Beispiel" funktioniert richtig:
Ich kann den
long
Wert aufnumpy-1.8.0
installiert wie folgt reproduzieren :Das gleiche Beispiel:
Es wird zurückgegeben,
long
da fornumpy.datetime64
type dem.astype(datetime)
entspricht, für.astype(object)
das Python integer (long
) zurückgegeben wirdnumpy-1.8
.Um ein Datum / Uhrzeit-Objekt zu erhalten, können Sie:
So erhalten Sie datetime64, das Sekunden direkt verwendet:
Die numpy-Dokumente besagen, dass die datetime-API experimentell ist und sich in zukünftigen numpy-Versionen ändern kann.
quelle
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
was ein langes (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
type(dt64)
istnumpy.datetime64
unddt64.astype(datetime)
ist das gleiche lange int ...: snumpy.__version__
->'1.6.1'
Sie können einfach den Konstruktor pd.Timestamp verwenden. Das folgende Diagramm kann für diese und verwandte Fragen hilfreich sein.
quelle
pd.to_datetime
konvertiert alles inpd.Timestamp
. Einpd.Timestamp
Objekt verfügt über die Methodeto_pydatetime
zum Zurücksetzen auf eindatetime.datetime
Objekt und eineto_datetime64
Methode zum Konvertieren innp.datetime64
.Willkommen in der Hölle.
Sie können ein datetime64-Objekt einfach übergeben an
pandas.Timestamp
:Ich habe festgestellt, dass dies in NumPy 1.6.1 nicht richtig funktioniert:
Auch
pandas.to_datetime
kann verwendet werden (dies ist aus der Entwickler - Version, nicht geprüft v0.9.1):quelle
issubclass(pd.Timestamp, datetime)
istTrue
. Und dieTimestamp
Klasse selbst hat eineto_datetime()
Methode.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
kehrtTimestamp('2012-05-01 00:00:00')
zumindest in Pandas zurück0.17.1
.Ich denke, es könnte eine konsolidiertere Anstrengung in einer Antwort geben, um die Beziehung zwischen Pythons datetime-Modul, numpys datetime64 / timedelta64 und den Timestamp / Timedelta-Objekten von pandas besser zu erklären.
Die datetime Standardbibliothek von Python
Die datetime-Standardbibliothek enthält vier Hauptobjekte
Erstellen Sie diese vier Objekte
NumPys datetime64- und timedelta64-Objekte
NumPy hat keine separaten Datums- und Zeitobjekte, sondern nur ein einzelnes datetime64-Objekt, um einen einzelnen Zeitpunkt darzustellen. Das datetime-Objekt des datetime-Moduls hat eine Genauigkeit von Mikrosekunden (eine Millionstel Sekunde). Mit dem datetime64-Objekt von NumPy können Sie die Genauigkeit von Stunden bis zu Attosekunden (10 ^ -18) festlegen. Der Konstruktor ist flexibler und kann eine Vielzahl von Eingaben vornehmen.
Konstruieren Sie die datetime64- und timedelta64-Objekte von NumPy
Übergeben Sie eine Ganzzahl mit einer Zeichenfolge für die Einheiten. Sehen Sie alle Einheiten hier . Es wird nach der UNIX-Epoche in so viele Einheiten umgewandelt: 1. Januar 1970
Sie können auch Zeichenfolgen verwenden, sofern diese im ISO 8601-Format vorliegen.
Timedeltas haben eine einzige Einheit
Sie können sie auch erstellen, indem Sie zwei datetime64-Objekte subtrahieren
Pandas Timestamp und Timedelta bieten viel mehr Funktionen als NumPy
Ein Pandas-Zeitstempel ist ein Moment, der einem Datum und einer Uhrzeit sehr ähnlich ist, aber viel mehr Funktionen bietet. Sie können sie entweder mit
pd.Timestamp
oder konstruierenpd.to_datetime
.pd.to_datetime
funktioniert sehr ähnlich (mit einigen weiteren Optionen) und kann eine Liste von Zeichenfolgen in Zeitstempel konvertieren.Konvertieren von Python datetime in datetime64 und Timestamp
Konvertieren von numpy datetime64 in datetime und Timestamp
In Zeitstempel konvertieren
Konvertieren Sie von Timestamp nach datetime und datetime64
Dies ist recht einfach, da Pandas Zeitstempel sehr leistungsfähig sind
quelle
Für
DatetimeIndex
gibt dastolist
eine Liste vondatetime
Objekten zurück. Für ein einzelnesdatetime64
Objekt wird ein einzelnesdatetime
Objekt zurückgegeben.quelle
.item()
das weitaus expliziter ist (und niemand kann vorbeikommen und argumentieren, dass es eine Liste zurückgeben sollte).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
was ein langes (1025222400000000000L
) (!).item()
(vorgeschlagen von @seberg) zurückgegeben wird,.tolist()
hängt davon ab, welche Einheiten datetime64 verwendet, z. B.D
produziertdatetime.date()
,us
(Mikrosekunden) produziertdatetime.datetime()
,ns
(Nanosekunden) produziertlong
. Und die Einheiten ändern sich abhängig von den Eingabewerten, z. B.numpy.datetime64('2012-05-01')
Verwendungen'D'
,numpy.datetime64('2012-05-01T00:00:00.000')
Verwendungenms
,numpy.datetime64('2012-05-01T00:00:00.000000000')
Verwendungenns
. Sie könnten ein Problem eröffnen, wenn Sie es verwirrend finden.Wenn Sie eine ganze Pandas-Reihe von Datumsangaben in reguläre Python-Datumsangaben konvertieren möchten, können Sie auch verwenden
.to_pydatetime()
.Es unterstützt auch Zeitzonen:
HINWEIS : Wenn Sie mit einer Pandas-Serie arbeiten, können Sie nicht
to_pydatetime()
die gesamte Serie aufrufen . Sie müssen.to_pydatetime()
jedes einzelne datetime64 mit einem Listenverständnis oder ähnlichem aufrufen:quelle
Eine Option ist zu verwenden
str
und dannto_datetime
(oder ähnlich):Hinweis: Es ist nicht gleich,
dt
weil es "Offset-fähig" geworden ist :Dies scheint unelegant.
.
Update: Dies kann mit dem "bösen Beispiel" umgehen:
quelle
Dieser Beitrag ist seit 4 Jahren aktiv und ich hatte immer noch Probleme mit diesem Konvertierungsproblem. Daher ist das Problem auch 2017 in gewissem Sinne noch aktiv. Ich war etwas schockiert, dass die Numpy-Dokumentation nicht ohne weiteres einen einfachen Konvertierungsalgorithmus bietet, aber das ist eine andere Geschichte.
Ich bin auf eine andere Möglichkeit gestoßen, die Konvertierung durchzuführen, die nur Module umfasst,
numpy
unddatetime
es müssen keine Pandas importiert werden, was für mich eine Menge Code zu importieren scheint, um eine so einfache Konvertierung durchzuführen. Ich habe festgestellt, dassdatetime64.astype(datetime.datetime)
eindatetime.datetime
Objekt zurückgegeben wird, wenn sich das Originaldatetime64
in Mikrosekundeneinheiten befindet, während andere Einheiten einen ganzzahligen Zeitstempel zurückgeben. Ich verwende ein Modulxarray
für Daten-E / A aus Netcdf-Dateien, das diedatetime64
In-Nanosekunden-Einheiten verwendet, wodurch die Konvertierung fehlschlägt, es sei denn, Sie konvertieren zuerst in Mikrosekunden-Einheiten. Hier ist der Beispielkonvertierungscode:Es wurde nur auf meinem Computer getestet, nämlich Python 3.6 mit einer aktuellen Anaconda-Distribution von 2017. Ich habe mir nur die Skalarkonvertierung angesehen und keine Array-basierten Konvertierungen überprüft, obwohl ich davon ausgehe, dass dies gut sein wird. Ich habe mir auch nicht den numpy datetime64-Quellcode angesehen, um festzustellen, ob die Operation sinnvoll ist oder nicht.
quelle
Ich bin öfter auf diese Antwort zurückgekommen, als ich zählen kann, und habe mich daher entschlossen, eine kurze kleine Klasse zusammenzustellen, die einen Numpy-
datetime64
Wert in einen Python-datetime
Wert konvertiert . Ich hoffe es hilft anderen da draußen.Ich werde das in meiner Werkzeugtasche aufbewahren, irgendetwas sagt mir, dass ich es wieder brauchen werde.
quelle
ts.to_pydatetime()
Verwenden Sie diese Funktion, um das native datetime-Objekt von Python abzurufen
quelle
replace() got an unexpected keyword argument 'tzinfo'
Einige Lösungen funktionieren gut für mich, aber numpy wird einige Parameter verwerfen. Die Lösung, die für mich besser funktioniert, besteht darin, das Datum als Pandas-Datum / Uhrzeit zu lesen und das Jahr, den Monat und den Tag eines Pandas-Objekts explizit zu extrahieren. Der folgende Code funktioniert für die häufigste Situation.
quelle
In der Tat können alle diese Datums- / Uhrzeittypen schwierig und möglicherweise problematisch sein (müssen die Zeitzoneninformationen sorgfältig verfolgen). Hier ist, was ich getan habe, obwohl ich zugebe, dass ich besorgt bin, dass zumindest ein Teil davon "nicht beabsichtigt" ist. Dies kann bei Bedarf auch etwas kompakter gestaltet werden. beginnend mit einer numpy.datetime64 dt_a:
numpy.datetime64 ('2015-04-24T23: 11: 26.270000-0700')
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... und das kann natürlich nach Bedarf zu einer Zeile komprimiert werden.
quelle
edit
Folgendes: Code-Formatierung, Zitat-Formatierung und Text-Formatierung. Auch beachten Sie bitte die richtige Großschreibung , Grammatik, und überprüfen Sie die Tippfehler, wie pro SO Richtlinien - siehe: Wie Post und Code - Beispiele