Python numpy: kann datetime64 [ns] nicht in datetime64 [D] konvertieren (zur Verwendung mit Numba)

8

Ich möchte ein Datetime-Array an eine Numba-Funktion übergeben (die nicht vektorisiert werden kann und ansonsten sehr langsam wäre). Ich verstehe, dass Numba numpy.datetime64 unterstützt. Es scheint jedoch, dass es datetime64 [D] (Tagesgenauigkeit) aber nicht datetime64 [ns] (Millisekunden-Genauigkeit) unterstützt (ich habe das auf die harte Tour gelernt: ist das dokumentiert?).

Ich habe versucht, von datetime64 [ns] zu datetime64 [D] zu konvertieren, aber ich finde keinen Weg! Irgendwelche Ideen?

Ich habe mein Problem mit dem folgenden minimalen Code zusammengefasst. Wenn Sie testdf(mydates) ausführen, was datetime64 [D] ist, funktioniert es einwandfrei. Wenn Sie testdf(dates_input) ausführen, was datetime64 [ns] ist, ist dies nicht der Fall. Beachten Sie, dass in diesem Beispiel die Daten einfach an die Numba-Funktion übergeben werden, die (noch) nichts mit ihnen macht. Ich versuche, dates_input in datetime64 [D] zu konvertieren, aber die Konvertierung funktioniert nicht. In meinem ursprünglichen Code lese ich aus einer SQL-Tabelle in einen Pandas-Datenrahmen und brauche eine Spalte, die den Tag jedes Datums auf den 15. ändert.

%Vor%

Der Fehler, den ich erhalte, wenn ich testdf(dates_input) verwende, ist:

%Vor%     
Pythonista anonymous 10.08.2015, 11:07
quelle

1 Antwort

16

Series.astype konvertiert alle datumsähnlichen Objekte in datetime64[ns] . Um in datetime64[D] zu konvertieren, verwenden Sie values , um vor dem Aufruf von astype :

ein NumPy-Array zu erhalten %Vor%

Beachten Sie, dass ND-Frames (wie Series und DataFrames) nur datumszeitähnliche Objekte als Objekte von dtype datetime64[ns] enthalten können. Die automatische Konvertierung aller datetime-likes in einen gemeinsamen dtyp vereinfacht die nachfolgenden Datumsberechnungen. Aber es macht es unmöglich, datetime64[s] -Objekte in einer DataFrame-Spalte zu speichern. Pandas Core-Entwickler, Jeff Reback erklärt ,

  

"Wir erlauben keine direkten Konvertierungen, weil es einfach zu kompliziert ist, etwas anderes als datetime64 [ns] intern (oder überhaupt nicht) zu speichern."

Beachten Sie auch, dass df['month_15'].astype('datetime64[D]') dtype datetime64[ns] :

hat %Vor%

Wenn Sie die Elemente in der Serie durchlaufen, erhalten Sie Pandas Timestamps , nicht datetime64[ns] s.

%Vor%

Daher ist es nicht klar, dass Numba tatsächlich ein Problem mit datetime64[ns] hat, es könnte nur ein Problem mit Timestamps sein. Tut mir leid, ich kann das nicht überprüfen - ich habe Numba nicht installiert.

Es könnte jedoch nützlich sein, dass Sie

ausprobieren %Vor%

seit df['month_15'].astype('datetime64[D]').values ist wirklich ein NumPy Array von dtype datetime64[ns] :

%Vor%

Wenn das funktioniert, müssen Sie nicht alles in datetime64[D] konvertieren, sondern nur NumPy-Arrays - nicht Pandas Series - an testf übergeben.

    
unutbu 10.08.2015, 11:18
quelle

Tags und Links