Número de Python: no se puede convertir datetime64 a datetime64 (para usar con Numba)

Quiero pasar una matriz de fecha y hora a una función Numba (que no puede ser vectorizada y de lo contrario sería muy lenta). Entiendo que Numba soporta numpy.datetime64. Sin embargo, parece que soporta datetime64 [D] (precisión del día) pero no datetime64 [ns] (milisegundos de precisión) (aprendí esto de la manera más difícil: ¿está documentado?)

Intenté convertir de datetime64 [ns] a datetime64 [D], ¡pero parece que no puedo encontrar una manera! ¿Algunas ideas?

He resumido mi problema con el código mínimo a continuación. Si ejecuta testdf(mydates) , que es datetime64 [D], funciona bien. Si ejecuta testdf(dates_input) , que es datetime64 [ns], no lo hace. Tenga en cuenta que este ejemplo simplemente pasa las fechas a la función Numba, que (aún) no hace nada con ellas. Intento convertir dates_input a datetime64 [D], pero la conversión no funciona. En mi código original, leí de una tabla de SQL a un dataframe de pandas y necesito una columna que cambie el día de cada fecha al 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) 

El error que recibo si ejecuto testdf(dates_input) es:

 numba.typeinfer.TypingError: Failed at nopython (nopython frontend) Var 'dates' unified to object: dates := {pyobject} 

Series.astype convierte todos los objetos similares a fechas a datetime64[ns] . Para convertir a datetime64[D] , use values para obtener una matriz NumPy antes de llamar a astype :

 dates_input = df["month_15"].values.astype('datetime64[D]') 

Tenga en cuenta que NDFrames (como Series y DataFrames) solo pueden contener objetos similares a datetime como objetos de dtype datetime64[ns] . La conversión automática de todos los me gusta de datetime a un dtype común simplifica los cálculos de fecha subsiguientes. Pero hace que sea imposible almacenar, por ejemplo, objetos datetime64[s] en una columna DataFrame. El desarrollador del núcleo de pandas, Jeff Reback explica ,

“No permitimos conversiones directas porque es simplemente demasiado complicado mantener cualquier cosa que no sea datetime64 [ns] internamente (ni es necesario en absoluto)”.


También tenga en cuenta que aunque df['month_15'].astype('datetime64[D]') tiene dtype datetime64[ns] :

 In [29]: df['month_15'].astype('datetime64[D]').dtype Out[29]: dtype(' 

cuando recorres los elementos de la serie, obtienes marcas de Timestamps pandas, no datetime64[ns] s.

 In [28]: df['month_15'].astype('datetime64[D]').tolist() Out[28]: [Timestamp('2010-01-15 00:00:00'), Timestamp('2011-01-15 00:00:00')] 

Por lo tanto, no está claro que Numba realmente tenga un problema con datetime64[ns] , simplemente podría tener un problema con las Timestamps . Lo siento, no puedo verificar esto, no tengo Numba instalado.

Sin embargo, podría ser útil para usted intentarlo.

 testf(df['month_15'].astype('datetime64[D]').values) 

Desde df['month_15'].astype('datetime64[D]').values son realmente una matriz NumPy de dtype datetime64[ns] :

 In [31]: df['month_15'].astype('datetime64[D]').values.dtype Out[31]: dtype(' 

Si eso funciona, entonces no tiene que convertir todo a datetime64[D] , solo tiene que pasar matrices NumPy (no Pandas Series) a testf .