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 ...
+1 de mí; su primera solución parece funcionar bien para mí (NumPy 2.0 dev). – doug
Me pregunto por qué funciona numpy.datetime64 ('20090921'), si el formato requerido es con guiones? – Benjamin
@Benjamin realmente extraño ... Pero tu comentario me dio una nueva idea, prueba mi respuesta actualizada, funcionó bien para mí. – mgibsonbr