2010-10-29 24 views
9

Quiero 'analizar las fechas en este formato, pero ignoro partes de la cadena. 'Mié, 27 de octubre de 1770 22:17:00 GMT' Según lo que he reunido, la fecha y hora no admite zonas horarias muy bien. Lo cual está bien, realmente solo quiero ignorar la zona horaria de la cadena, sin tener que manipular cadenas. ¿Hay algo que pueda reemplazar% Z por debajo para decir "cualquier cadena aquí" y analizar las fechas como tales? Además, no entiendo por qué analizará las zonas horarias como PST, GMT pero no EST. No parece adjuntar tzinfo en cualquier caso de todos modos, no estoy seguro de qué tipo de cadena realmente busca la porción% Z.Formato de fecha de análisis de Python, ignore las partes de la cadena

>>> import datetime 
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z') 
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 PST', '%a, %d %b %Y %H:%M:%S %Z') 
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 EST', '%a, %d %b %Y %H:%M:%S %Z') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/brazil-pkg-cache/packages/Python/Python-2.5.1.17.1/RHEL5_64/DEV.STD.PTHREAD/build/lib/python2.5/_strptime.py", line 331, in strptime 
    (data_string, format)) 
ValueError: time data did not match format: data=Wed, 27 Oct 1770 22:17:00 EST fmt=%a, %d %b %Y %H:%M:%S %Z 

Nota: dateutil no es una opción para mí, quiero apoyar numerosos formatos y no puedo permitir que dateutil para interpretar accidentalmente fechas equivocadas. (es decir, dateutil parece adivinar cuándo ve fechas como 01/02/2010, 1 de febrero o 2 de enero). Básicamente quiero intentar aceptar formatos que especifico en un orden hasta que obtengo una coincidencia.

Respuesta

1

No creo que sea posible hacerlo completamente sin manipulaciones de cadenas, pero tal vez esta es una opción. Echar un vistazo a tiempo y probar algo como esto:

datetime(*(time.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')[0:5])) 
0

No parece ser una manera de hacer que en strptime(). Sé que dijiste que no querías manipular las cuerdas, pero es posible que no puedas elegir. Puede realizar una limpieza de datos en la que primero restringe la cadena de fecha/hora desde la entrada, o puede crear mystrptime() y solo hacer la manipulación en la excepción. El siguiente código es incorrecto porque no maneja el caso general de% Z que ocurre en cualquier lugar de la cadena, pero se entiende la idea.

import re, datetime 

def mystrptime(time_str, format): 
    try: 
     return datetime.datetime.strptime(time_str, format) 
    except ValueError: 
     if not '%Z' in format: 
      raise # it must have been something else 
     new_time_str = re.sub(r'\s*\w+\s*$', '', time_str) 
     new_format = re.sub(r'\s*%Z\s*$', '', format) 
     return datetime.datetime.strptime(new_time_str, new_format) 
4

¿De verdad ha mirado los documentos para dateutil?

dateutil.parser.parse() tiene argumentos que let you control la precedencia en su formateador y también tiene un argumento ignoretz=True.

Si eso no es suficiente, es probable que haya alguna clase que pueda anular para implementar sus propias reglas de precedencia.

Por supuesto, si no, probablemente tendrá que recurrir al análisis de cadenas ya que la implementación de Pypt's strptime() llama a la implementación C subyacente para resolver los nombres de la zona horaria. (No sé por qué no entiende EST para usted, pero es probable que todo el sistema no sea un problema en algunos sistemas)

3
val = str.join(' ', 'Wed, 17 Oct 2011 22:22:22 +0300'.split(None)[1:7]) 

val = datetime.datetime.strptime(val, '%d %b %Y %H:%M:%S') 
+5

Las respuestas de código puro no son útiles en sí mismas, ya que tienden a promover la programación _copy-and-paste._ Siempre que sea posible, se debe dar una explicación del código y _por qué_ funciona. :) – Miguel

+0

Aunque estoy de acuerdo con @Miguel, +1 por una respuesta única que aborda la cuestión. –

+0

No es esto más simple: '' .join ('Mié, 17 de octubre de 2011 22:22:22 + 0300'.split() [1: 6]) También lo anterior no funcionará b/c de la configuración de la zona horaria. Obtienes ValueError: quedan datos no convertidos – radtek

Cuestiones relacionadas