numpy datetime64 en recarray

Tengo problemas para crear una matriz de registros con el tipo datetime64. Estoy ejecutando Python 2.7, Numpy 1.7.

Aquí hay un ejemplo mínimo:

p_dtype = np.dtype({"names": ['trns_id', 'trns_date', 'qty', 'price', 'amount', 'description', 'commission', 'fees'], "formats": [long, "M8", float, float, float, "S40", float, float]}) p_row = (8609132959, np.datetime64('2012-05-01'), 337.574, 4.86, -1640.61, 'Bought 337.574 XYZ @ 4.86', 0.0, 0.0) print p_list, p_dtype p_array = np.array(p_row, dtype=p_dtype) 

Me sale el siguiente error (y salida):

 TypeError Traceback (most recent call last)  in () 6 print p_list, p_dtype 7 ----> 8 p_array = np.array(p_row, dtype=p_dtype) 9 10 print "Array: %s, dtype: %s" % (p_array, p_array.dtype) TypeError: Cannot cast NumPy timedelta64 scalar from metadata [D] to according to the rule 'same_kind' (8609132959.0, numpy.datetime64('2012-05-01'), 337.574, 4.86, -1640.61, 'Bought 337.574 PIMSX @ 4.86', 0.0, 0.0) [('trns_id', '<i8'), ('trns_date', '<M8'), ('qty', '<f8'), ('price', '<f8'), ('amount', '<f8'), ('description', 'S40'), ('commission', '<f8'), ('fees', '<f8')] 

Consejos, alguien?

Especifique un dtype datetime de “fecha”. Es decir, "M8[D]" lugar de "M8" , o 'datetime64[D]' lugar de 'datetime64' .

 In [80]: np.array([(0,np.datetime64('2012-05-17'))], ....: dtype=[('i',np.int),('date','datetime64[D]')]) Out[80]: array([(0, datetime.date(2012, 5, 17))], dtype=[('i', ' 

Tenga en cuenta que también puede np.datetime('2012-05-17') sus datos simplemente como la cadena (es decir, '2012-05-17' , en lugar del objeto np.datetime('2012-05-17') )

 In [81]: np.array([(0,'2012-05-17')], ....: dtype=[('i',np.int),('date','datetime64[D]')]) Out[81]: array([(0, datetime.date(2012, 5, 17))], dtype=[('i', ' 

Parece que estos tipos se interpretan de manera diferente en el caso del tipo de dtype único del caso de dtype estructurado. No se encontraría con el problema que tiene con un solo tipo de letra como aquí:

 In [84]: np.array([np.datetime64('2012-05-17')], dtype='datetime64') # no need for [D] Out[84]: array(['2012-05-17'], dtype='datetime64[D]') In [85]: np.array(['2012-05-17'], dtype='datetime64') # no need for [D] Out[85]: array(['2012-05-17'], dtype='datetime64[D]') 

Pero hazlo estructurado y tienes el problema:

 In [87]: np.array([(0,'2012-05-17')], ....: dtype=[('i',np.int),('date','datetime64')]) --------------------------------------------------------------------------- ValueError: Cannot create a NumPy datetime other than NaT with generic units In [88]: np.array([(0,np.datetime64('2012-05-17'))], ....: dtype=[('i',np.int),('date','datetime64')]) --------------------------------------------------------------------------- TypeError: Cannot cast NumPy timedelta64 scalar from metadata [D] to according to the rule 'same_kind' 

numpy tiene una página en datetime, es bastante pesada pero responde a la mayoría de las preguntas.

Dos cosas a tener en cuenta:

  • la separación entre la fecha y la hora, como en la fecha y hora de python
  • El contexto de uso que es específico de numpy (el sufijo [*])

El problema encontrado anteriormente es del segundo tipo,

 dtnow = datetime.datetime.now() numpy.datetime64(dtnow, '[D]') 
 Rastreo (llamadas recientes más última):
   Archivo "", línea 1, en 
 TypeError: No se puede convertir el objeto datetime.datetime de los metadatos [us] a [D] de acuerdo con la regla 'same_kind'
 numpy.datetime64(dtnow, '[s]') 

numpy.datetime64 (‘2015-06-27T14: 53: 21 + 0300’)

Si su datetime nunca tendrá un componente de tiempo que datetime64 [D] sería suficiente.

sin embargo, si es así, sugeriría usar datetime64 [s] en un contexto de segundo nivel.