python - yesterday - Compruebe si la cadena tiene fecha, cualquier formato
strftime python (2)
Eche un vistazo a la función de parse
en dateutils.parser
. Es capaz de analizar casi cualquier cadena a un objeto de datetime
y datetime
.
Si simplemente quiere saber si una cadena en particular podría representar una fecha, puede probar la siguiente función:
from dateutil.parser import parse
def is_date(string):
try:
parse(string)
return True
except ValueError:
return False
Entonces tiene:
>>> is_date("1990-12-1")
True
>>> is_date("xyznotadate")
False
Una nota de precaución: el parse
puede reconocer algunas cadenas como fechas que no desea tratar como fechas, por ejemplo, "23, 4"
se analizarán como datetime.datetime(2023, 4, 16, 0, 0)
. Es posible que necesite controles adicionales si desea detectar estos casos.
¿Cómo verifico si una cadena puede ser analizada a una fecha?
- 19 de enero de 1990
- 19 de enero de 1990
- 19 de enero de 1990
- 19/01/1990
- 19/01/90
- 1990
- Enero de 1990
- Enero de 1990
Estas son todas las fechas válidas. Si existe alguna inquietud con respecto a la falta de espacio entre las cosas en el artículo 3 y el último artículo anterior, se puede remediar fácilmente insertando automáticamente un espacio entre letras / caracteres y números, si es necesario.
Pero primero, lo básico:
Intenté ponerlo en una if statement
:
if datetime.strptime(item, ''%Y'') or datetime.strptime(item, ''%b %d %y'') or datetime.strptime(item, ''%b %d %Y'') or datetime.strptime(item, ''%B %d %y'') or datetime.strptime(item, ''%B %d %Y''):
Pero eso está en un bloque try-except, y sigue devolviendo algo como esto:
16343 time data ''JUNE1890'' does not match format ''%Y''
A menos que se cumpla la primera condición en la sentencia if
.
Para aclarar, no necesito realmente el valor de la fecha, solo quiero saber si lo es. Idealmente, habría sido algo como esto:
if item is date:
print date
else:
print "Not a date"
¿Hay alguna manera de hacer esto?
Si desea analizar esos formatos en particular, puede compararlos con una lista de formatos:
txt=''''''/
Jan 19, 1990
January 19, 1990
Jan 19,1990
01/19/1990
01/19/90
1990
Jan 1990
January1990''''''
import datetime as dt
fmts = (''%Y'',''%b %d, %Y'',''%b %d, %Y'',''%B %d, %Y'',''%B %d %Y'',''%m/%d/%Y'',''%m/%d/%y'',''%b %Y'',''%B%Y'',''%b %d,%Y'')
parsed=[]
for e in txt.splitlines():
for fmt in fmts:
try:
t = dt.datetime.strptime(e, fmt)
parsed.append((e, fmt, t))
break
except ValueError as err:
pass
# check that all the cases are handled
success={t[0] for t in parsed}
for e in txt.splitlines():
if e not in success:
print e
for t in parsed:
print ''"{:20}" => "{:20}" => {}''.format(*t)
Huellas dactilares:
"Jan 19, 1990 " => "%b %d, %Y " => 1990-01-19 00:00:00
"January 19, 1990 " => "%B %d, %Y " => 1990-01-19 00:00:00
"Jan 19,1990 " => "%b %d,%Y " => 1990-01-19 00:00:00
"01/19/1990 " => "%m/%d/%Y " => 1990-01-19 00:00:00
"01/19/90 " => "%m/%d/%y " => 1990-01-19 00:00:00
"1990 " => "%Y " => 1990-01-01 00:00:00
"Jan 1990 " => "%b %Y " => 1990-01-01 00:00:00
"January1990 " => "%B%Y " => 1990-01-01 00:00:00