En este post de programación en Python vamos a resolver varios ejercicios con fechas. Se trata del tema introducción a la programación en donde se extra el año, mes y día de una fecha representada como entero.
Además de eso se muestran otras funciones que validan el año, el mes, obtienen el nombre del mes, etcétera.
Descripción
La solicitud dice así:
Una forma de representar fechas es utilizando números enteros de la siguiente forma: los primeros cuatro dígitos corresponden al año, los siguiente dos dígitos corresponden al mes, y los últimos dos dígitos corresponden al día. Por ejemplo, el número 20200901 representa la fecha 01/09/2020.
Para esta tarea, supondremos que los números que representan fechas siempre tienen 8 dígitos, y que el primer dígito siempre es distinto a 0 (por lo que sólo sirve para representar fechas entre el año 1000 y el año 9999).
El objetivo de esta tarea es programar un módulo con funciones que permitan trabajar con fechas en este formato. Las funciones que Ud. debe implementar son las siguientes:
- Función
year
: recibe una fecha representada como entero y devuelve un texto con el año de la fecha. - Función
month
: recibe una fecha representada como entero y devuelve un texto con el mes de la fecha. Si el número del mes no es válido, debe devolver el texto ‘FECHA INCORRECTA’. - Función
monthName
: recibe una fecha representada como entero y devuelve un texto con el nombre del mes, en español, de la fecha (‘enero’, ‘febrero’, . . . , ‘diciembre’). Si el número del mes no es válido, debe devolver el texto ‘FECHA INCORRECTA’. - Función
day
: recibe una fecha representada como entero y devuelve un texto con el día de la fecha. Si el número del día no es válido (esto depende del mes, considere si el año es bisiesto para el caso de febrero) o el mes es inválido (por lo que no se puede verificar el día), debe devolver el texto ‘FECHA INCORRECTA’. - Función
date2Text
: recibe una fecha representada como entero y devuelve un texto con la fecha completa en el formato ‘DD/MM/AAAA’. Por ejemplo,date2Text(20200903)
devuelve el texto ’03/09/2020′. Si el mes o el día no son válidos, debe devolver el texto ‘FECHA INCORRECTA’. - Función
date2TextName
: recibe una fecha representada como entero y devuelve un texto con la fecha completa en el formato ‘X de Y de Z’, usando el nombre del mes. Por ejemplo,date2Text(20200903)
devuelve el texto ‘3 de septiembre de 2020’. Si el mes o el día no son válidos, debe devolver el texto ‘FECHA INCORRECTA’. - Función
manyDates
: recibe un número con varias fechas representadas como entero (cantidad no definida a priori), y devuelve un texto con las fechas en el formato ‘DD/MM/AAAA’, con cada fecha separada por un salto de línea (carácter ‘\n’) y en el mismo orden que aparecen en el número. Por ejemplo,manyDates(2020090320200904)
devuelve el texto'\n03/09/2020\n04/09/2020'
. Note que después de la ´ultima fecha no hay un carácter de salto de línea , pero sí en el primer carácter del texto. Si algunas de las fechas no son válidas, solo sus línea correspondientes deben decir ‘FECHA INCORRECTA’. - Función
sameDates
: recibe dos parámetros, un número con varias fechas representadas como entero (cantidad no definida a priori) y una fecha representada como entero, y devuelve la cantidad de fechas iguales en el entero con varias fechas a la fecha correspondiente al segundo parámetro, pero sólo considerando el día y mes (el año puede ser distinto). Por ejemplo,sameDates(202009032021090420000903, 21000903)
devuelve 2.
Funciones auxiliares
Para resolver estos ejercicios de programación en Python necesitamos algunas funciones auxiliares. Además, se solicita el uso de las mismas y también se sugiere evitar repetición de código, por lo que debemos usar métodos que hagan distintas cosas para la fecha.
Así que las auxiliares quedan así:
"""
Funciones auxiliares para reutilizar más tarde
"""
def extraer_anio(fecha):
# Convertimos a string y extraemos los primeros 4 dígitos
return str(fecha)[0:4]
def extraer_mes(fecha):
return str(fecha)[4:6]
def extraer_dia(fecha):
return str(fecha)[6:8]
def year(fecha):
return extraer_anio(fecha)
def es_mes_valido(mes):
mes_como_entero = int(mes)
if mes_como_entero <= 0 or mes_como_entero > 12:
return False
else:
return True
def es_bisiesto(anio):
return anio % 4 == 0 and (anio % 100 != 0 or anio % 400 == 0)
def obtener_dias_del_mes(mes, anio):
mes_entero = int(mes)
anio_entero = int(anio)
# Abril, junio, septiembre y noviembre tienen 30
if mes_entero in [4, 6, 9, 11]:
return 30
# Febrero depende de si es o no bisiesto
if mes_entero == 2:
if es_bisiesto(anio_entero):
return 29
else:
return 28
else:
# En caso contrario, tiene 31 días
return 31
def es_dia_valido(anio, mes, dia):
dia_entero = int(dia)
dias_del_mes = obtener_dias_del_mes(mes, anio)
if dia_entero <= 0 or dia_entero > dias_del_mes:
return False
else:
return True
def extraer_fechas(fechas):
lista = []
fechas_string = str(fechas)
cantidad_fechas = int(len(fechas_string) / 8)
for i in range(cantidad_fechas):
fecha_extraida = fechas_string[i * 8:(i * 8) + 8]
lista.append(fecha_extraida)
return lista
Solución a asignaciones
A continuación vemos la solución:
"""
Funciones de la asignación
"""
def month(fecha):
mes = extraer_mes(fecha)
if not es_mes_valido(mes):
return "FECHA INCORRECTA"
else:
return mes
def monthName(fecha):
mes = extraer_mes(fecha)
if not es_mes_valido(mes):
return "FECHA INCORRECTA"
else:
meses = ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre",
"noviembre", "diciembre"]
mes_como_entero = int(mes)
# Usamos al mes como índice de la lista
indice = mes_como_entero - 1
# Y extraemos el nombre
nombre_mes = meses[indice]
return nombre_mes
def day(fecha):
anio = extraer_anio(fecha)
mes = extraer_mes(fecha)
dia = extraer_dia(fecha)
dia_entero = int(dia)
if not es_mes_valido(mes) or not es_dia_valido(anio, mes, dia):
return "FECHA INCORRECTA"
else:
return dia
def date2Text(fecha):
anio = extraer_anio(fecha)
mes = extraer_mes(fecha)
dia = extraer_dia(fecha)
if not es_mes_valido(mes) or not es_dia_valido(anio, mes, dia):
return "FECHA INCORRECTA"
else:
return dia + "/" + mes + "/" + anio
def date2TextName(fecha):
anio = extraer_anio(fecha)
mes = extraer_mes(fecha)
dia = extraer_dia(fecha)
if not es_mes_valido(mes) or not es_dia_valido(anio, mes, dia):
return "FECHA INCORRECTA"
nombre_mes = monthName(fecha)
# Lo convertimos a entero para quitar el cero a la izquierda en caso de que lo tenga
dia_entero = int(dia)
return str(dia_entero) + " de " + nombre_mes + " de " + anio
def manyDates(fechas):
fechas_transformadas = extraer_fechas(fechas)
resultado = ""
for fecha in fechas_transformadas:
resultado += "\n" + date2Text(int(fecha))
return resultado
def sameDates(fechas, fecha):
fechas_extraidas = extraer_fechas(fechas)
cantidad = 0
mes_referencia = extraer_mes(fecha)
dia_referencia = extraer_dia(fecha)
for fecha in fechas_extraidas:
mes = extraer_mes(int(fecha))
dia = extraer_dia(int(fecha))
if mes == mes_referencia and dia == dia_referencia:
cantidad += 1
return cantidad
print(sameDates(2020121920201218202012182020123220200101, 20201218), end="")
Poniendo todo junto
El código completo queda así. Recuerda que puedes invocar a las funciones desde cualquier lugar. En este caso solo estoy haciendo una prueba al final del archivo.
"""
https://parzibyte.me/blog
"""
"""
Funciones auxiliares para reutilizar más tarde
"""
def extraer_anio(fecha):
# Convertimos a string y extraemos los primeros 4 dígitos
return str(fecha)[0:4]
def extraer_mes(fecha):
return str(fecha)[4:6]
def extraer_dia(fecha):
return str(fecha)[6:8]
def year(fecha):
return extraer_anio(fecha)
def es_mes_valido(mes):
mes_como_entero = int(mes)
if mes_como_entero <= 0 or mes_como_entero > 12:
return False
else:
return True
def es_bisiesto(anio):
return anio % 4 == 0 and (anio % 100 != 0 or anio % 400 == 0)
def obtener_dias_del_mes(mes, anio):
mes_entero = int(mes)
anio_entero = int(anio)
# Abril, junio, septiembre y noviembre tienen 30
if mes_entero in [4, 6, 9, 11]:
return 30
# Febrero depende de si es o no bisiesto
if mes_entero == 2:
if es_bisiesto(anio_entero):
return 29
else:
return 28
else:
# En caso contrario, tiene 31 días
return 31
def es_dia_valido(anio, mes, dia):
dia_entero = int(dia)
dias_del_mes = obtener_dias_del_mes(mes, anio)
if dia_entero <= 0 or dia_entero > dias_del_mes:
return False
else:
return True
def extraer_fechas(fechas):
lista = []
fechas_string = str(fechas)
cantidad_fechas = int(len(fechas_string) / 8)
for i in range(cantidad_fechas):
fecha_extraida = fechas_string[i * 8:(i * 8) + 8]
lista.append(fecha_extraida)
return lista
"""
Funciones de la asignación
"""
def month(fecha):
mes = extraer_mes(fecha)
if not es_mes_valido(mes):
return "FECHA INCORRECTA"
else:
return mes
def monthName(fecha):
mes = extraer_mes(fecha)
if not es_mes_valido(mes):
return "FECHA INCORRECTA"
else:
meses = ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre",
"noviembre", "diciembre"]
mes_como_entero = int(mes)
# Usamos al mes como índice de la lista
indice = mes_como_entero - 1
# Y extraemos el nombre
nombre_mes = meses[indice]
return nombre_mes
def day(fecha):
anio = extraer_anio(fecha)
mes = extraer_mes(fecha)
dia = extraer_dia(fecha)
dia_entero = int(dia)
if not es_mes_valido(mes) or not es_dia_valido(anio, mes, dia):
return "FECHA INCORRECTA"
else:
return dia
def date2Text(fecha):
anio = extraer_anio(fecha)
mes = extraer_mes(fecha)
dia = extraer_dia(fecha)
if not es_mes_valido(mes) or not es_dia_valido(anio, mes, dia):
return "FECHA INCORRECTA"
else:
return dia + "/" + mes + "/" + anio
def date2TextName(fecha):
anio = extraer_anio(fecha)
mes = extraer_mes(fecha)
dia = extraer_dia(fecha)
if not es_mes_valido(mes) or not es_dia_valido(anio, mes, dia):
return "FECHA INCORRECTA"
nombre_mes = monthName(fecha)
# Lo convertimos a entero para quitar el cero a la izquierda en caso de que lo tenga
dia_entero = int(dia)
return str(dia_entero) + " de " + nombre_mes + " de " + anio
def manyDates(fechas):
fechas_transformadas = extraer_fechas(fechas)
resultado = ""
for fecha in fechas_transformadas:
resultado += "\n" + date2Text(int(fecha))
return resultado
def sameDates(fechas, fecha):
fechas_extraidas = extraer_fechas(fechas)
cantidad = 0
mes_referencia = extraer_mes(fecha)
dia_referencia = extraer_dia(fecha)
for fecha in fechas_extraidas:
mes = extraer_mes(int(fecha))
dia = extraer_dia(int(fecha))
if mes == mes_referencia and dia == dia_referencia:
cantidad += 1
return cantidad
print(sameDates(2020121920201218202012182020123220200101, 20201218), end="")