461 Stimmen

Konvertierung zwischen datetime, Timestamp und datetime64

Wie konvertiere ich eine numpy.datetime64 Objekt zu einem datetime.datetime (oder Timestamp )?

Im folgenden Code erstelle ich die Objekte datetime, timestamp und datetime64.

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, das Datum aus dem Zeitstempel zu ermitteln:

In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

Aber wie extrahieren wir die datetime o Timestamp von einer 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')

die sein sollten datetime.datetime(2002, 6, 28, 1, 0) und nicht eine lange (!) ( 1025222400000000000L )...

16voto

Andy Hayden Punkte 324102

Eine Möglichkeit ist die Verwendung von str und dann to_datetime (oder ähnlich):

In [11]: str(dt64)
Out[11]: '2012-05-01T01:00:00.000000+0100'

In [12]: pd.to_datetime(str(dt64))
Out[12]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))

Hinweis: Es ist nicht gleichzusetzen mit dt denn es ist zu einem "Offset-bewusst" :

In [13]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[13]: datetime.datetime(2012, 5, 1, 1, 0)

Das wirkt unelegant.

.

Aktualisierung: Dies kann mit dem "bösen Beispiel" umgehen:

In [21]: dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

In [22]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[22]: datetime.datetime(2002, 6, 28, 1, 0)

16voto

fantabolous Punkte 18632

Wenn Sie eine ganze Pandas-Reihe von Datumsangaben in reguläre Python-Datumsangaben umwandeln wollen, können Sie auch .to_pydatetime() .

pd.date_range('20110101','20110102',freq='H').to_pydatetime()

> [datetime.datetime(2011, 1, 1, 0, 0) datetime.datetime(2011, 1, 1, 1, 0)
   datetime.datetime(2011, 1, 1, 2, 0) datetime.datetime(2011, 1, 1, 3, 0)
   ....

Es unterstützt auch Zeitzonen:

pd.date_range('20110101','20110102',freq='H').tz_localize('UTC').tz_convert('Australia/Sydney').to_pydatetime()

[ datetime.datetime(2011, 1, 1, 11, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
 datetime.datetime(2011, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
....

ANMERKUNG : Wenn Sie mit einer Pandas-Serie arbeiten, können Sie die to_pydatetime() über die gesamte Serie. Sie müssen anrufen .to_pydatetime() auf jedes einzelne datetime64 mit Hilfe eines Listenverständnisses oder etwas Ähnlichem:

datetimes = [val.to_pydatetime() for val in df.problem_datetime_column]

10voto

ndl303 Punkte 101

Dieser Beitrag steht seit 4 Jahren und ich habe immer noch mit diesem Umstellungsproblem zu kämpfen - das Problem ist also in gewisser Weise auch 2017 noch aktiv. Ich war etwas schockiert, dass die Numpy-Dokumentation nicht ohne Weiteres einen einfachen Konvertierungsalgorithmus anbietet, aber das ist eine andere Geschichte.

Ich bin auf eine andere Möglichkeit der Konvertierung gestoßen, die nur Module umfasst numpy y datetime Es ist nicht erforderlich, Pandas zu importieren, was mir für eine so einfache Konvertierung sehr viel Code zu sein scheint. Ich bemerkte, dass datetime64.astype(datetime.datetime) gibt eine datetime.datetime Objekt, wenn das Original datetime64 ist in Mikrosekunden-Einheiten während andere Einheiten einen ganzzahligen Zeitstempel zurückgeben. Ich verwende das Modul xarray für Daten-E/A aus Netcdf-Dateien, die die datetime64 in Nanosekunden-Einheiten, so dass die Umrechnung fehlschlägt, es sei denn, Sie konvertieren zuerst in Mikrosekunden-Einheiten. Hier ist ein Beispiel für die Umrechnung,

import numpy as np
import datetime

def convert_datetime64_to_datetime( usert: np.datetime64 )->datetime.datetime:
    t = np.datetime64( usert, 'us').astype(datetime.datetime)
return t

Es ist nur auf meinem Rechner getestet, die Python 3.6 mit einer aktuellen 2017 Anaconda Distribution ist. Ich habe nur auf skalare Konvertierung und haben nicht überprüft Array basierte Konvertierungen, obwohl ich vermute, es wird gut sein. Ich habe mir auch nicht den Numpy datetime64-Quellcode angesehen, um zu sehen, ob die Operation Sinn macht oder nicht.

1voto

Crystal Punkte 347
import numpy as np
import pandas as pd 

def np64toDate(np64):
    return pd.to_datetime(str(np64)).replace(tzinfo=None).to_datetime()

Verwenden Sie diese Funktion, um Pythons natives Datetime-Objekt zu erhalten

1voto

MikeyE Punkte 1506

Ich bin auf diese Antwort öfter zurückgekommen, als ich zählen kann, also habe ich beschlossen, eine schnelle kleine Klasse zu erstellen, die eine Numpy datetime64 Wert zu Python datetime Wert. Ich hoffe, es hilft anderen da draußen.

from datetime import datetime
import pandas as pd

class NumpyConverter(object):
    @classmethod
    def to_datetime(cls, dt64, tzinfo=None):
        """
        Converts a Numpy datetime64 to a Python datetime.
        :param dt64: A Numpy datetime64 variable
        :type dt64: numpy.datetime64
        :param tzinfo: The timezone the date / time value is in
        :type tzinfo: pytz.timezone
        :return: A Python datetime variable
        :rtype: datetime
        """
        ts = pd.to_datetime(dt64)
        if tzinfo is not None:
            return datetime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, tzinfo=tzinfo)
        return datetime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second)

Ich werde das in meiner Werkzeugtasche aufbewahren, irgendetwas sagt mir, dass ich es wieder brauchen werde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X