Python-numpy: cannot convert datetime64[ns], um datetime64[D] (zur Verwendung mit Numba)
Möchte ich weitergeben, einen datetime-array an eine Numba-Funktion (die nicht vektorisiert und sonst sehr langsam). Ich verstehe Numba unterstützt numpy.datetime64. Es scheint jedoch, es unterstützt datetime64[D] (Tag genau), aber nicht datetime64[ns] (Millisekunden genau) (ich lernte das auf die harte Tour: wird es dokumentiert?).
Habe ich versucht zu konvertieren von datetime64[ns], um datetime64[D], kann aber nicht scheinen, um einen Weg zu finden! Irgendwelche Ideen?
Habe ich zusammengefasst mein problem mit den minimal-code unten. Wenn Sie testdf(mydates)
, die datetime64[D], funktioniert es einwandfrei. Wenn Sie testdf(dates_input)
, die datetime64[ns], ist es nicht. Beachten Sie, dass dieses Beispiel einfach übergibt die Daten an die Numba-Funktion, die nicht (noch) nichts mit Ihnen. Ich versuche, Sie zu konvertieren dates_input zu datetime64[D], aber die Konvertierung funktioniert nicht. In meinem ursprünglichen code, ich lese aus einer SQL-Tabelle in ein pandas dataframe, und brauchen eine Spalte, die Veränderungen der Tag des jeweiligen Datum um den 15.
import numba
import numpy as np
import pandas as pd
import datetime
mydates =np.array(['2010-01-01','2011-01-02']).astype('datetime64[D]')
df=pd.DataFrame()
df["rawdate"]=mydates
df["month_15"] = df["rawdate"].apply(lambda r: datetime.date( r.year, r.month,15 ) )
dates_input = df["month_15"].astype('datetime64[D]')
print dates_input.dtype # Why datetime64[ns] and not datetime64[D] ??
@numba.jit(nopython=True)
def testf(dates):
return 1
print testf(mydates)
Den Fehler bekomme ich, wenn ich testdf(dates_input)
ist:
numba.typeinfer.TypingError: Failed at nopython (nopython frontend)
Var 'dates' unified to object: dates := {pyobject}
- Dies ist eine wirklich nützliche Frage, aber es war aus irgendeinem Grund sehr schwer zu finden, nur über die Suche. Erhielt ich eine ähnliche Fehlermeldung, wenn Sie versuchen zu verwenden
np.busday_count
auf pandas Daten, die gelesen:TypeError: Iterator operand 0 dtype could not be cast from dtype('<M8[ns]') to dtype('<M8[D]') according to the rule 'safe'
Du musst angemeldet sein, um einen Kommentar abzugeben.
Series.astype
konvertiert alle Datum-wie Objekte zudatetime64[ns]
.Konvertieren
datetime64[D]
verwendenvalues
zu erhalten, ein NumPy-array vor dem Aufrufastype
:Beachten Sie, dass NDFrames (wie Serie und DataFrames) nur halten kann datetime-wie Objekte als Objekte von dtype
datetime64[ns]
. Die automatische Konvertierung aller datetime-mag zu einer gemeinsamen "dtype" vereinfacht die späteren Berechnungen. Aber es macht es unmöglich, zu speichern, zu sagen,datetime64[s]
Objekte in einem DataFrame Spalte. Pandas-Kern-Entwickler, Jeff Reback erklärt,Beachten Sie auch, dass, obwohl
df['month_15'].astype('datetime64[D]')
hat dtypedatetime64[ns]
:beim Durchlaufen der Elemente in der Serie, Sie erhalten pandas
Timestamps
, nichtdatetime64[ns]
s.Daher ist es nicht klar, dass Numba hat tatsächlich ein problem mit
datetime64[ns]
, es könnte nur ein problem mitTimestamps
. Sorry, ich kann nicht überprüfen, diese-ich weiß nicht Numba installiert.Jedoch könnte es nützlich für Sie, um zu versuchen,
seit
df['month_15'].astype('datetime64[D]').values
ist wirklich ein NumPy-array von dtypedatetime64[ns]
:Wenn das funktioniert, dann müssen Sie nicht haben, um alles zu konvertieren, um
datetime64[D]
Sie bestehen NumPy-arrays-nicht Pandas Serie -- zutestf
.datetime64[ns]
. Es gibt Vorteile, dies zu tun: Es macht den Vergleich und Datum arithmetische einfacher. Eine Folge davon ist, dass es gibt keine Serie von dtypedatetime64[D]
. Vielleichtdf['month_15'].astype('datetime64[D]')
sollte eine Ausnahme ausgelöst, anstatt still zu konvertierendatetime64[ns]
, aber solange Pandas behält seine Trichter-alles-zu-datetime64[ns] Richtliniedf['month_15'].astype('datetime64[D]')
ist nicht wieder eine Reihe von dtypedatetime64[D]
.datetime64[ns]
hat einer Genauigkeit im Nanosekundenbereich, nicht Millisekunden-Präzision.