2012-04-24 8 views
5

Mi servidor de la nube registros de tiempo en este formato:fecha de análisis y marcas de tiempo en Python con el formato time.strptime

[17/Dec/2011:09:48:49 -0600] 

Para leerlo en variables de Python, lo que puedo decir:

>>>str = '17/Dec/2011:09:48:49 -0600' 
>>>import time 
>>>print time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600") 

Resultado:

time.struct_time(tm_year=2011, tm-mon=12, tm=mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1) 

o puedo tratar

>>>mytime = time.strptime(str,"%d/%b/%Y:%H:%M:%S -0600") 
>>>print mytime.tm_hour 

Resultado:

9 

¿Qué significa el -0600 hacer? ¿Esperaba que ajustara el valor de la hora en el objeto de fecha y hora? ¿Hay un comodín para usar en lugar de codificar el -0600?

Respuesta

8

El -0600 es el desplazamiento del meridiano de Greenwich (GMT). Como another SO question already says, time.strptime no puede leer los offsets de la zona horaria, aunque datetime.strftime puede generarlos.

Como se explicó al comienzo de the datetime module's documentation, hay dos formas de acercarse al "tiempo" en python, ingenuo o consciente. Cuando lo único que le importa es el tiempo dentro de su sistema, el tratamiento de los objetos de tiempo/fecha y hora inocentes está bien (en cuyo caso puede quitar el desplazamiento como se sugirió). Cuando necesite comparar los valores dentro de su sistema con la noción del mundo real del tiempo, debe comenzar a manejar esa compensación.

La fácil manera de hacer frente a esto es sólo a use python-dateutil. Tiene un parse function que hará todo lo posible para hacer coincidir difusamente la cadena de fecha que pasa en múltiples formatos y devolver una instancia de fecha y hora que sea operativa y que represente su mejor estimación de lo que usted quiso decir.

>>> from dateutil.parser import parse 
>>> parse('17/Dec/2011:09:48:49 -0600', fuzzy=True) 
datetime.datetime(2011, 12, 17, 9, 48, 49, tzinfo=tzoffset(None, -21600)) 

Normalmente, tener software da su "mejor estimación" es una mala cosa. En este caso, parece justificado si sus formatos de entrada son estables. Lidiar con el tiempo en el desarrollo de software es difícil, simplemente vaya de compras.

+0

Estoy echando un vistazo a python-dateutil. No había sido consciente de su propósito. – TGanoe

2

Es la compensación de GMT. Si no lo quiere, simplemente tira hacia fuera:

>>> import time 
>>> line = '17/Dec/2011:09:48:49 -0600' 
>>> line = line.split(' ')[0] 
>>> print time.strptime(line,"%d/%b/%Y:%H:%M:%S") 
time.struct_time(tm_year=2011, tm_mon=12, tm_mday=17, tm_hour=9, tm_min=48, tm_sec=49, tm_wday=5, tm_yday=351, tm_isdst=-1) 
+0

Me gusta la forma de dividir la fecha y tomar el primer índice todo en una línea – TGanoe

+0

también funciona con expresiones regulares: newdate = re.split ("", myStr) [0] – TGanoe

1

strptime simplemente se refiere a los modificadores (%d, %b, ...) con los segmentos correspondientes de la cadena y luego se convierte a juego con trozo de cuerda a un entero. Entonces, en su caso, el -0600 solo hace que su cadena de formato coincida con la cadena de entrada.

Si desea ajustar la hora en un desplazamiento especificado, le recomendaría usar un objeto datetime.

>>>s = '17/Dec/2011:09:48:49 -0600' 
>>>from datetime import datetime,timedelta 
>>>mytime = datetime.strptime(s,"%d/%b/%Y:%H:%M:%S -0600") 
>>>dt = timedelta(minutes=6*60) #6 hours 
>>>mytime-=dt 
>>>print mytime 
2011-12-17 03:48:49 
>>>print mytime.hour 
3 

También tenga en cuenta que, dado que str es una orden interna, en general no es recomendable reasignar.

+0

Gracias por apuntar que usar str como nombre de variable. ¡Mal hábito! – TGanoe

Cuestiones relacionadas