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

328voto

Quant Punkte 3865

Sie können einfach den pd.Timestamp-Konstruktor verwenden. Das folgende Diagramm kann für diese und ähnliche Fragen nützlich sein.

Conversions between time representations

223voto

Wes McKinney Punkte 94041

Willkommen in der Hölle.

Sie können einfach ein datetime64-Objekt an pandas.Timestamp :

In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>

Ich habe festgestellt, dass dies in NumPy 1.6.1 nicht richtig funktioniert:

numpy.datetime64('2012-05-01T01:00:00.000000+0100')

Auch, pandas.to_datetime verwendet werden kann (dies ist aus der Entwicklungsversion, ich habe v0.9.1 nicht überprüft):

In [24]: pandas.to_datetime('2012-05-01T01:00:00.000000+0100')
Out[24]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))

190voto

jfs Punkte 370717

Umrechnen numpy.datetime64 zu datetime Objekt, das die Zeit in UTC auf numpy-1.8 :

>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'

Das obige Beispiel geht davon aus, dass ein naiver datetime Objekt wird interpretiert von np.datetime64 als Zeit in UTC.


Umrechnen datetime zu np.datetime64 und zurück ( numpy-1.6 ):

>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)

Es funktioniert sowohl bei einem einzelnen np.datetime64 Objekt und ein Numpy-Array aus np.datetime64 .

Denken Sie an np.datetime64 so wie Sie es auch bei np.int8 , np.int16 usw. und wenden dieselben Methoden an, um zwischen Python-Objekten wie z. B. int , datetime und entsprechende Numpy-Objekte.

Ihr "böses Beispiel" funktioniert korrekt:

>>> from datetime import datetime
>>> import numpy 
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy

Ich kann die long Wert auf numpy-1.8.0 installiert als:

pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev

Das gleiche Beispiel:

>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'

Sie gibt zurück long denn für numpy.datetime64 Typ .astype(datetime) ist gleichbedeutend mit .astype(object) die eine Python-Ganzzahl ( long ) an numpy-1.8 .

Um die datetime Objekt, das Sie können:

>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)

Um die datetime64 die Sekunden direkt verwendet:

>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)

Die Numpy-Dokumente sagen, dass die Datetime-API experimentell ist und sich in zukünftigen Numpy-Versionen ändern kann.

163voto

Ted Petrou Punkte 56706

Ich denke, man könnte sich in einer Antwort mehr anstrengen, um die Beziehung zwischen dem datetime-Modul von Python, datetime64/timedelta64 von Numpy und den Timestamp/Timedelta-Objekten von Pandas besser zu erklären.

Die datetime-Standardbibliothek von Python

Die datetime-Standardbibliothek hat vier Hauptobjekte

  • Zeit - nur Zeit, gemessen in Stunden, Minuten, Sekunden und Mikrosekunden
  • Datum - nur Jahr, Monat und Tag
  • datetime - Alle Komponenten von Zeit und Datum
  • timedelta - Eine Zeitspanne mit einer maximalen Einheit von Tagen

Erstellen Sie diese vier Objekte

>>> import datetime
>>> datetime.time(hour=4, minute=3, second=10, microsecond=7199)
datetime.time(4, 3, 10, 7199)

>>> datetime.date(year=2017, month=10, day=24)
datetime.date(2017, 10, 24)

>>> datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 24, 4, 3, 10, 7199)

>>> datetime.timedelta(days=3, minutes = 55)
datetime.timedelta(3, 3300)

>>> # add timedelta to datetime
>>> datetime.timedelta(days=3, minutes = 55) + \
    datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 27, 4, 58, 10, 7199)

NumPy's datetime64 und timedelta64 Objekte

NumPy hat keine separaten Datums- und Zeitobjekte, sondern nur ein einziges datetime64-Objekt, das einen einzelnen Zeitpunkt darstellt. Das datetime-Objekt des datetime-Moduls hat eine Genauigkeit von einer Mikrosekunde (ein Millionstel einer Sekunde). Mit dem datetime64-Objekt von NumPy können Sie die Genauigkeit von Stunden bis hin zu Attosekunden (10 ^ -18) einstellen. Sein Konstruktor ist flexibler und kann eine Vielzahl von Eingaben verarbeiten.

Konstruieren Sie die NumPy-Objekte datetime64 und timedelta64

Übergeben Sie eine Ganzzahl mit einer Zeichenkette für die Einheiten. Siehe alle Einheiten hier . Sie wird nach der UNIX-Epoche in so viele Einheiten umgerechnet: 1. Januar 1970

>>> np.datetime64(5, 'ns') 
numpy.datetime64('1970-01-01T00:00:00.000000005')

>>> np.datetime64(1508887504, 's')
numpy.datetime64('2017-10-24T23:25:04')

Sie können auch Zeichenketten verwenden, solange sie im ISO 8601-Format vorliegen.

>>> np.datetime64('2017-10-24')
numpy.datetime64('2017-10-24')

Timedeltas haben eine einzige Einheit

>>> np.timedelta64(5, 'D') # 5 days
>>> np.timedelta64(10, 'h') 10 hours

Sie können auch durch Subtraktion zweier datetime64-Objekte erstellt werden

>>> np.datetime64('2017-10-24T05:30:45.67') - np.datetime64('2017-10-22T12:35:40.123')
numpy.timedelta64(147305547,'ms')

Pandas Timestamp und Timedelta bauen viel mehr Funktionalität auf NumPy auf

Ein Pandas Timestamp ist ein Moment in der Zeit, der einer Datetime sehr ähnlich ist, aber viel mehr Funktionalität hat. Sie können sie entweder mit pd.Timestamp o pd.to_datetime .

>>> pd.Timestamp(1239.1238934) #defaults to nanoseconds
Timestamp('1970-01-01 00:00:00.000001239')

>>> pd.Timestamp(1239.1238934, unit='D') # change units
Timestamp('1973-05-24 02:58:24.355200')

>>> pd.Timestamp('2017-10-24 05') # partial strings work
Timestamp('2017-10-24 05:00:00')

pd.to_datetime funktioniert sehr ähnlich (mit ein paar mehr Optionen) und kann eine Liste von Zeichenketten in Zeitstempel umwandeln.

>>> pd.to_datetime('2017-10-24 05')
Timestamp('2017-10-24 05:00:00')

>>> pd.to_datetime(['2017-1-1', '2017-1-2'])
DatetimeIndex(['2017-01-01', '2017-01-02'], dtype='datetime64[ns]', freq=None)

Konvertierung von Python datetime in datetime64 und Timestamp

>>> dt = datetime.datetime(year=2017, month=10, day=24, hour=4, 
                   minute=3, second=10, microsecond=7199)
>>> np.datetime64(dt)
numpy.datetime64('2017-10-24T04:03:10.007199')

>>> pd.Timestamp(dt) # or pd.to_datetime(dt)
Timestamp('2017-10-24 04:03:10.007199')

Konvertierung von numpy datetime64 in datetime und Timestamp

>>> dt64 = np.datetime64('2017-10-24 05:34:20.123456')
>>> unix_epoch = np.datetime64(0, 's')
>>> one_second = np.timedelta64(1, 's')
>>> seconds_since_epoch = (dt64 - unix_epoch) / one_second
>>> seconds_since_epoch
1508823260.123456

>>> datetime.datetime.utcfromtimestamp(seconds_since_epoch)
>>> datetime.datetime(2017, 10, 24, 5, 34, 20, 123456)

In Zeitstempel umwandeln

>>> pd.Timestamp(dt64)
Timestamp('2017-10-24 05:34:20.123456')

Konvertierung von Timestamp in datetime und datetime64

Dies ist recht einfach, da Pandas Zeitstempel sehr leistungsfähig sind

>>> ts = pd.Timestamp('2017-10-24 04:24:33.654321')

>>> ts.to_pydatetime()   # Python's datetime
datetime.datetime(2017, 10, 24, 4, 24, 33, 654321)

>>> ts.to_datetime64()
numpy.datetime64('2017-10-24T04:24:33.654321000')

38voto

eumiro Punkte 193562
>>> dt64.tolist()
datetime.datetime(2012, 5, 1, 0, 0)

Für DatetimeIndex die tolist gibt eine Liste von datetime Objekte. Für ein einzelnes datetime64 Objekt gibt es ein einzelnes datetime Objekt.

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