Python: ejercicios resueltos de fechas

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:

  1. Función year: recibe una fecha representada como entero y devuelve un texto con el año de la fecha.
  2. 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’.
  3. 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’.
  4. 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’.
  5. 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’.
  6. 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’.
  7. 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’.
  8. 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="")

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *