2012-03-01 23 views
37

tengo un sistema (desarrollado en Python) que acepta fecha y hora como cadena en varios formatos y tengo que de análisis formatos de cadena them..Currently de fecha y hora son:Parche de fecha y hora en Python ...?

Fri Sep 25 18:09:49 -0500 2009 

2008-06-29T00:42:18.000Z 

2011-07-16T21:46:39Z 

1294989360 

ahora quiero un genérica parser que puede convertir cualquiera de estos formatos de fecha y hora en el objeto de fecha y hora apropiado ...

De lo contrario, tengo que ir con analizarlos individualmente. Por lo tanto, también proporcione un método para analizarlos individualmente (si no hay un analizador genérico) .. !!

Respuesta

52

Como sugirió @TimPietzcker, el paquete dateutil es el camino a seguir, que maneja los 3 primeros formatos correctamente y de forma automática:

>>> from dateutil.parser import parse 
>>> parse("Fri Sep 25 18:09:49 -0500 2009") 
datetime.datetime(2009, 9, 25, 18, 9, 49, tzinfo=tzoffset(None, -18000)) 
>>> parse("2008-06-29T00:42:18.000Z") 
datetime.datetime(2008, 6, 29, 0, 42, 18, tzinfo=tzutc()) 
>>> parse("2011-07-16T21:46:39Z") 
datetime.datetime(2011, 7, 16, 21, 46, 39, tzinfo=tzutc()) 

El formato unixtime parece Hick sobre, pero por suerte el estándar datetime.datetime es para la tarea:

>>> from datetime import datetime 
>>> datetime.utcfromtimestamp(float("1294989360")) 
datetime.datetime(2011, 1, 14, 7, 16) 

es bastante fácil de hacer una función de esto que maneja todos los formatos 4:

from dateutil.parser import parse 
from datetime import datetime 

def parse_time(s): 
    try: 
     ret = parse(s) 
    except ValueError: 
     ret = datetime.utcfromtimestamp(s) 
    return ret 
+0

en realidad esto es lo que ya hice, cuando sugirió @TimPietzcker ... puedes ver eso en el comentario ... !! .. pero gracias por la increíble respuesta (y la descripción del código) .. !! –

+0

Para instalar dateutil: 'pip install python-dateutil'. Es como si quisieran pensar que no es un paquete legítimo cuando no ofrecen la manera de instalarlo a través de 'pip'. – ArtOfWarfare

14

Debería consultar el paquete dateutil.

+6

especialmente 'dateutil.parser.parse()' – Kimvais

+0

gracias por la respuesta .. !! .. pero una cosa ... "dateutil.parser.parse" está analizando los primeros 3 formatos de fecha ... pero no puede analizar el último formato de fecha (que es un valor largo) ... Muestra una excepción de "año fuera de rango" ... Pero el módulo de fecha y hora incorporado de Python puede analizar este valor largo ... ¿por qué es así? –

Cuestiones relacionadas