2012-05-08 31 views
34

Tengo una cadena de fechahora que no sé cómo analizarla en Python.Serie de tiempo de análisis en Python

La cadena es la siguiente:

Tue May 08 15:14:45 +0800 2012 

me trataron

datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y") 

pero Python lanza

'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y' 

De acuerdo con Python doc:

%z UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive).

¿Cuál es el formato correcto para analizar esta cadena de tiempo?

+0

relacionados: [Python: análisis fecha con la zona horaria de un correo electrónico] (http://stackoverflow.com/q/1790795/4279) – jfs

Respuesta

55

datetime.datetime.strptime tiene problemas con la zona horaria de análisis. Echar un vistazo a la dateutil package:

>>> from dateutil import parser 
>>> parser.parse("Tue May 08 15:14:45 +0800 2012") 
datetime.datetime(2012, 5, 8, 15, 14, 45, tzinfo=tzoffset(None, 28800)) 
+0

alguna idea sobre cómo analizar' 02/Nov/2012: 06: 37: 42 + 0000'? Ese es el formato que nginx usa en los archivos de registro, y 'parser.parse' devuelve' ValueError: unknown string format'. – zidarsk8

+0

@ zidarsk8: Primero necesita eliminar los dos puntos después de la fecha: '' 'parser.parse (" 06/abr/2014: 13: 23: 04 ".replace (": "," ", 1))' ' ' –

+8

@ zidarsk8 intente esto:' parser.parse ("02/Nov/2012: 06: 37: 42 +0000", fuzzy = True) '- especificando fuzzy, el analizador ignora los caracteres que no comprende. – drevicko

1
In [117]: datetime.datetime.strptime? 
Type:   builtin_function_or_method 
Base Class:  <type 'builtin_function_or_method'> 
String Form: <built-in method strptime of type object at 0x9a2520> 
Namespace:  Interactive 
Docstring: 
    string, format -> new datetime parsed from a string (like time.strptime()). 
+1

Intenté 'datetime.strptime (" mar 08 de mayo 15:14:45 +0800 2012 ","% a% b% d% H:% M:% S% z% Y ")', pero Python plantea que '' z 'es una directiva incorrecta en formato'% a% b% d% H:% M:% S% z% Y ' ' – xiaohan2012

13

Su mejor opción es tener un vistazo a strptime()

Algo a lo largo de las líneas de

>>> from datetime import datetime 
>>> date_str = 'Tue May 08 15:14:45 +0800 2012' 
>>> date = datetime.strptime(date_str, '%a %B %d %H:%M:%S +0800 %Y') 
>>> date 
datetime.datetime(2012, 5, 8, 15, 14, 45) 

No estoy seguro de cómo hacer la zona horaria 0800 desafortunadamente, tal vez alguien más pueda ayudar con eso.

Las cadenas de formato se pueden encontrar en http://docs.python.org/library/time.html#time.strftime y son las mismas para formatear la cadena para imprimir.

Espero que ayude

Marcos

PS, la mejor opción para las zonas horarias en la instalación de pytz PyPI. (http://pytz.sourceforge.net/) de hecho, creo que pytz tiene un gran método de análisis de fecha y hora, si mal no recuerdo. La lib estándar es un poco delgada en el suelo con la funcionalidad de la zona horaria.

+0

eumiro menciona 'datetime.datetime.strptime' tiene problemas con el análisis de zona horaria. Yo pienso que es verdad – xiaohan2012

3

Se ha discutido muchas veces en SO. En resumen, "% z" no es compatible porque la plataforma no lo admite. Mi solución es una nueva, simplemente omitir la zona horaria .:

datetime.datetime.strptime(re.sub(r"[+-]([0-9])+", "", "Tue May 08 15:14:45 +0800 2012"),"%a %b %d %H:%M:%S %Y") 
3

he aquí una solución stdlib que soporta un desplazamiento en la cadena de tiempo de entrada variable UTC:

>>> from email.utils import parsedate_tz, mktime_tz 
>>> from datetime import datetime, timedelta 
>>> timestamp = mktime_tz(parsedate_tz('Tue May 08 15:14:45 +0800 2012')) 
>>> utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp) 
>>> utc_time 
datetime.datetime(2012, 5, 8, 7, 14, 45) 
Cuestiones relacionadas