2012-03-08 15 views
8

¿Cuál es la forma correcta de convertir las fechas de enteros a datetime64 en numpy? Intenté:Convertir matriz float32 a datetime64 en Numpy 1.6.1

import numpy 
a = numpy.array([20090913, 20101020, 20110125]) 
numpy.datetime64(a.astype("S8")) 

pero obtengo una conversión incorrecta. ¿Qué hay de leerlos correctamente como objetos numpy.datetime64 usando numpy.loadtxt (vienen de un archivo csv)?

Respuesta

5

Curiosamente, esto funciona: numpy.datetime64(a.astype("S8").tolist()), mientras que esto no es así: numpy.datetime64(a.astype("S8")). El primer método es aún menos intrincado que: numpy.array([numpy.datetime64(str(i)) for i in a]). Pregunté por qué en this question.

5

Su problema es que datetime64 espera una cadena en el formato yyyy-mm-dd, mientras que la conversión de tipo produce cadenas en el formato yyyymmdd. Yo sugeriría algo como esto:

conversion = lambda x: "%s-%s-%s" % (x[:4], x[4:6], x[6:]) 
np_conversion = numpy.frompyfunc(conversion,1,1) 
b = np_conversion(a.astype('S10')) 
numpy.datetime64(b) 

Sin embargo no está funcionando para mí (he 1.6.1 numpy), se produce un error con el mensaje "NotImplementedError: No se ha aplicado para este tipo". A menos que se implementa en 1.7, sólo puedo sugerir una solución pura de Python:

numpy.datetime64(numpy.array([conversion(str(x)) for x in a], dtype="S10")) 

... o pre-procesamiento de su entrada, para entregar las fechas en el formato esperado.

Editar: también puede ofrecer una solución alternativa, utilizando vectorize, pero no saben muy bien cómo funciona, por lo que no sé lo que va mal:

>>> conversion = vectorize(lambda x: "%s-%s-%s" % (x[:4], x[4:6], x[6:]), otypes=['S10']) 
>>> conversion(a.astype('S10')) 
array(['2009', '2010', '2011'], 
     dtype='|S4') 

Para algunos razón por la que está ignorando el otypes y sacando |S4 en lugar de |S10. Lo siento, no puedo ayudar más, pero esto debería proporcionar un punto de partida para buscar otras soluciones.

Actualización: Gracias a OP feedback, pensé en una nueva posibilidad. Esto debería funcionar como se esperaba:

>>> conversion = lambda x: numpy.datetime64(str(x)) 
>>> np_conversion = numpy.frompyfunc(conversion, 1, 1) 
>>> np_conversion(a) 
array([2009-09-13 00:00:00, 2010-10-20 00:00:00, 2011-01-25 00:00:00], dtype=object) 

# Works too: 
>>> conversion = lambda x: numpy.datetime64("%s-%s-%s" % (x/10000, x/100%100, x%100)) 

extraño cómo, en este caso, datetime64 funciona bien con o sin los guiones ...

+0

+1 de mí; su primera solución parece funcionar bien para mí (NumPy 2.0 dev). – doug

+0

Me pregunto por qué funciona numpy.datetime64 ('20090921'), si el formato requerido es con guiones? – Benjamin

+0

@Benjamin realmente extraño ... Pero tu comentario me dio una nueva idea, prueba mi respuesta actualizada, funcionó bien para mí. – mgibsonbr

Cuestiones relacionadas