2013-10-21 10 views
17

Ich habe Probleme beim Konvertieren eines Python datetime64 Objekts in eine Zeichenfolge. Zum Beispiel:Convert numpy.datetime64 in String-Objekt in Python

t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400') 

In:

'2012.07.01' as a string. (note time difference) 

habe versucht, ich bereits das datetime64 Objekt zu einem datetime lange dann in eine Zeichenfolge zu konvertieren, aber ich glaube, diesen Fehler zu erhalten:

dt = t.astype(datetime.datetime) #1341100800000000000L 
time.ctime(dt) 
ValueError: unconvertible time 
+1

Does http://stackoverflow.com/questions/13703720/ converting-between datetime-timestamp-and-datetime64 hilft Ihr spezifisches Problem? –

+0

Danke, Lösung war: import pandas als pd \t ts = pd.to_datetime (str (Datum)) \t d = ts.strftime ('%. Y.% m% d') –

Antwort

28

Lösung war:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d') 
0

Es gibt eine Route ohne Pandas; aber siehe unten.

Nun, die t Variable hat eine Auflösung von Nanosekunden, die durch Inspektion in Python dargestellt werden können:

>>> numpy.dtype(t) 
dtype('<M8[ns]') 

Dies bedeutet, dass der Integralwert dieses Wertes 10^9-fache des UNIX-Zeitstempel. Der Wert in Ihrer Frage gibt diesen Hinweis. Ihre beste Wette ist der Integralwert von t von 1 teilen Milliarden, dann können Sie verwenden time.strftime:

>>> import time 
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000)) 
2012.07.01 

In dieser Verwendung bewusst sein, zwei Annahmen:

1) die datetime64 Auflösung von Nanosekunden

2) die in datetime64 gespeicherte Zeit ist in UTC

Exkurs 1: Interessanterweise sind die numpy Entwickler entschieden [1], dass datetime64 Objekt, das eine Auflösung größer als Mikrosekunde hat, wird in einen long Typ umgewandelt, was erklärt, warum t.astype(datetime.datetime)1341100800000000000L ergibt. Der Grund dafür ist, dass das datetime.datetime Objekt nicht genau eine Nanosekunden- oder feinere Zeitskala darstellen kann, da die von datetime.datetime unterstützte Auflösung nur Mikrosekunden beträgt.

Exkurs 2: die verschiedenen Konventionen zwischen numpy 1.10 Vorsicht und früher vs 1.11 und höher:

  • in numpy < = 1,10, wird datetime64 intern als UTC gespeichert und als lokale Zeit gedruckt. Das Parsen setzt lokale Zeit voraus, wenn kein TZ angegeben ist, andernfalls wird der Zeitzonen-Offset berücksichtigt.

  • In numpy> = 1.11 wird datetime64 intern als Zeitzonen-unabhängiger Wert (Sekunden seit 1970-01-01 00:00 in unspezifizierter Zeitzone) gespeichert und als solcher gedruckt. Die Zeitanalyse geht nicht von der Zeitzone aus, obwohl die Zeitzonenverschiebung +NNNN weiterhin zulässig ist und der Wert in UTC konvertiert wird.

[1]: https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/datetime.c siehe Routine convert_datetime_to_pyobject.

4

Wenn Sie diese Umwandlung Geschwafel nicht tun wollen und mit nur einem Datumsformat ok, das war die beste Lösung für mich

str(t)[:10] 
Out[11]: '2012-07-01'