python datetime strptime

datetime to timestamp python



Cómo eliminar datos no convertidos de un objeto datetime de Python (6)

A menos que desee volver a escribir strptime (una muy mala idea), la única opción real que tiene es strptime y strptime los caracteres adicionales al final, suponiendo que esto le dará el resultado correcto que desea.

Por ejemplo, puede capturar el ValueError , la ValueError y volver a intentarlo:

def parse_prefix(line, fmt): try: t = time.strptime(line, fmt) except ValueError as v: if len(v.args) > 0 and v.args[0].startswith(''unconverted data remains: ''): line = line[:-(len(v.args[0]) - 26)] t = time.strptime(line, fmt) else: raise return t

Por ejemplo:

parse_prefix( ''2015-10-15 11:33:20.738 45162 INFO core.api.wsgi yadda yadda.'', ''%Y-%m-%d %H:%M:%S'' ) # -> time.struct_time(tm_year=2015, tm_mon=10, tm_mday=15, tm_hour=11, tm_min=33, ...

Tengo una base de datos de Sat Dec 22 12:34:08 PST 20102015 su mayor parte correctas, pero algunas se han roto de esa manera: Sat Dec 22 12:34:08 PST 20102015

Sin el año inválido, esto me funcionó:

end_date = soup(''tr'')[4].contents[1].renderContents() end_date = time.strptime(end_date,"%a %b %d %H:%M:%S %Z %Y") end_date = datetime.fromtimestamp(time.mktime(end_date))

Pero una vez que golpeo un objeto con un año no válido, obtengo ValueError: unconverted data remains: 2 , lo cual es genial, pero no estoy seguro de cuál es la mejor manera de quitar los caracteres malos del año. Van desde 2 hasta 6 unconverted characters .

Cualquier punteros? Simplemente end_date pero tengo la esperanza de que exista una estrategia de fecha y hora segura.


Aquí hay una sola línea más simple que uso:

end_date = end_date[:-4]


Mejorando (espero) el código de Adam Rosenfield:

import time for end_date in ( ''Fri Feb 18 20:41:47 Paris, Madrid 2011'', ''Fri Feb 18 20:41:47 Paris, Madrid 20112015''): print end_date fmt = "%a %b %d %H:%M:%S %Z %Y" try: end_date = time.strptime(end_date, fmt) except ValueError, v: ulr = len(v.args[0].partition(''unconverted data remains: '')[2]) if ulr: end_date = time.strptime(end_date[:-ulr], fmt) else: raise v print end_date,''/n''


Sí, acabo de cortar los números extra. Suponiendo que siempre se agreguen a la cita de datos, algo como esto funcionaría:

end_date = end_date.split(" ") end_date[-1] = end_date[-1][:4] end_date = " ".join(end_date)

Iba a intentar obtener el número de dígitos excedentes de la excepción, pero en mis versiones instaladas de Python (2.6.6 y 3.1.2) esa información no está realmente allí; solo dice que los datos no coinciden con el formato. Por supuesto, puede continuar recortando los dígitos uno a la vez y volviendo a analizar hasta que no obtenga una excepción.

También puede escribir una expresión regular que solo coincida con fechas válidas, incluyendo el número correcto de dígitos en el año, pero eso parece una exageración.


Un enfoque mucho más limpio es:

from datetime import datetime def parse_prefix(line, fmt): cover = len(datetime.now().strftime(fmt)) return datetime.strptime(line[:cover], fmt)

Ejemplo:

t = parse_prefix( ''2018-10-16T17:49:24.06392/4'', ''%Y-%m-%d'' ) # -> datetime.datetime(2018, 10, 16, 0, 0)


strptime() realmente espera ver una fecha con el formato correcto, por lo que es probable que tenga que hacer un poco de munging en la cadena end_date antes de llamarla.

Esta es una forma de cortar el último elemento en la fecha end_date a 4 caracteres:

chop = len(end_date.split()[-1]) - 4 end_date = end_date[:-chop]