2016-05-20 4 views
2

Ich würde gerne eine Pandas Data Frame Spalte in datetime Format von datetime64 setzen. Dies funktioniert auf individueller Basis. Insbesondere arbeitet die folgenden Fein:Wie konvertiert man eine Pandas-Datenrahmenspalte von np.datetime64 nach datetime?

t = dt['time'].values[0] 
datetime.utcfromtimestamp(t.astype(int)/1000000000) 

Allerdings, wenn ich versuchen, diese

auf die gesamte Spalte zu tun
dt['datetime'] = dt['time'].apply(lambda x: datetime.utcfromtimestamp(x.astype(int)/1000000000)) 

ich die folgende Fehlermeldung erhalten:

Pandas/src/inference.pyx in pandas.lib.map_infer (Pandas/lib.c: 62578)()

<ipython-input-26-5950d82979b4> in <lambda>(x) 
     1 print(type(dt['time'].values[0])) 
     2 
----> 3 dt['datetime'] = dt['time'].apply(lambda x: datetime.utcfromtimestamp(x.astype(int)/1000000000)) 
     4 t = dt['time'].values[0] 
     5 print(t) 

AttributeError: 'Timestamp' object has no attribute 'astype' 

Was mache ich falsch? Wie kann ich meine Spalte in datetime konvertieren und/oder eine neue Spalte im Format datetime erstellen?

Hier die Informationen für den Datenrahmen sind:

info

+0

@unutbu Fertig! Danke für einen Blick. – helloB

Antwort

0

Ohne Ihre Datensatz, habe ich auf einige Dinge zu erraten. Aber Sie sollten in der Lage sein, das Gleiche zu wiederholen, was Sie bewiesen haben, als hätten Sie gearbeitet.

dt['datetime'] = datetime.utcfromtimestamp(dt['time'].values.astype(int)/1000000000)) 
+0

danke für den Vorschlag, aber dies erzeugt auch einen Fehler: 'TypeError: int() Argument muss eine Zeichenfolge, ein Byte-ähnliches Objekt oder eine Zahl sein, nicht' Timestamp ' – helloB

2

Sie können Serien von dtype konvertieren datetime64[ns] zu einem NumPy Array von datetime.datetime Objekte durch die .dt.to_pydatetime() Methode aufrufen:

In [75]: df.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 252 entries, 0 to 251 
Data columns (total 1 columns): 
time 252 non-null datetime64[ns]<--the `time` column has dtype `datetime64[ns]` 
dtypes: datetime64[ns](1) 
memory usage: 2.0 KB 

In [77]: df.head() 
Out[77]: 
     time 
0 2009-01-02 
1 2009-01-05 
2 2009-01-06 
3 2009-01-07 
4 2009-01-08 


In [76]: df['time'].dt.to_pydatetime()[:5] 
Out[76]: 
array([datetime.datetime(2009, 1, 2, 0, 0), 
     datetime.datetime(2009, 1, 5, 0, 0), 
     datetime.datetime(2009, 1, 6, 0, 0), 
     datetime.datetime(2009, 1, 7, 0, 0), 
     datetime.datetime(2009, 1, 8, 0, 0)], dtype=object) 

Beachten Sie, dass NDFrames (wie Serien und Datenrahmen) nur halten datumsähnliche Objekte als Objekte von dtype datetime64[ns]. Die automatische Konvertierung aller datetime-likes in einen gemeinsamen dtyp vereinfacht die nachfolgenden Datumsberechnungen. Aber es macht es unmöglich, Python datetime.datetime Objekte in einer DataFrame-Spalte zu speichern. Pandas Core Entwickler, Jeff Reback explains,

"We don't allow direct conversions because its simply too complicated to keep anything other than datetime64[ns] internally (nor necessary at all)."

+0

Vielen Dank. Das bringt mich auf den Weg dorthin, aber ich möchte, dass diese Datetime eine Spalte des ursprünglichen Datenrahmens ist. Wie mache ich das, wenn Sie ein Array produzieren? – helloB

+0

Pandas arbeitet sehr hart, um sicherzustellen, dass datumszeitartige Objekte in einem DataFrame in 'datetime64 [ns]' dtype konvertiert werden. Dies hat den Vorteil, dass ungleiche datumszeitähnliche Objekte in einen einzigen Datentyp eingeordnet werden, der gut für Berechnungen ist. Aber es macht es (glaube ich) unmöglich, datetime-ähnliche Objekte in einem dtype anders als "datetime64 [ns]" in einer DataFrame-Spalte zu speichern. Wenn Sie mit Python 'datetime.datetime' arbeiten müssen, müssen Sie sie in einer Variablen außerhalb des Datenrahmens behalten. – unutbu

+0

Das gleiche Problem ist aufgetreten [http://stackoverflow.com/a/31918181/190597] - das OP wollte eine Reihe von dtype 'datetime64 [D]' anstelle von 'datetime.datetime', aber es war unmöglich aus dem gleichen Grund. – unutbu

Verwandte Themen