Cómo calcular las horas de luz con Python sin usar una API
Hace poco estuve repasando algunas operaciones con fechas y horas en Python y encontré un ejemplo bastante práctico: calcular cuánto dura el día a partir de las horas de salida y puesta del Sol.
No necesitamos instalar bibliotecas externas ni conectarnos a ningún servicio. Para este ejercicio, basta con dos horarios y el módulo datetime.
Eso sí, hay una diferencia importante: vamos a calcular la duración entre dos horas conocidas, no a predecir astronómicamente cuándo sale o se pone el Sol.
El problema
Imaginemos que tenemos estos datos:
- Amanecer: 07:15
- Puesta del Sol: 18:42
¿Cuántas horas de luz hay entre ambos momentos?
Podríamos hacer la resta manualmente, pero resulta más interesante crear una función reutilizable.
Primera versión con Python
from datetime import datetime
amanecer = "07:15"
atardecer = "18:42"
formato = "%H:%M"
inicio = datetime.strptime(amanecer, formato)
fin = datetime.strptime(atardecer, formato)
duracion = fin - inicio
print(duracion)
El resultado es:
11:27:00
Funciona, pero podemos mejorar la salida para que sea más fácil de leer.
Una función reutilizable
Vamos a encapsular el cálculo y devolver el resultado en horas y minutos.
from datetime import datetime, timedelta
def horas_de_luz(amanecer: str, atardecer: str) -> str:
formato = "%H:%M"
inicio = datetime.strptime(amanecer, formato)
fin = datetime.strptime(atardecer, formato)
if fin < inicio:
fin += timedelta(days=1)
diferencia = fin - inicio
minutos = int(diferencia.total_seconds() // 60)
horas, minutos_restantes = divmod(minutos, 60)
return f"{horas} h {minutos_restantes} min"
print(horas_de_luz("07:15", "18:42"))
print(horas_de_luz("06:30", "20:10"))
Salida:
11 h 27 min
13 h 40 min
La función utiliza strptime() para convertir las cadenas de texto en objetos de fecha y hora.
Después calcula la diferencia y la transforma en minutos.
Con divmod() obtenemos las horas completas y los minutos restantes.
¿Por qué comprobamos si la hora final es menor?
En una resta de horarios puede aparecer un valor negativo cuando el segundo horario corresponde al día siguiente.
La comprobación permite manejar ese caso como un intervalo general.
Sin embargo, para calcular horas reales de luz es preferible trabajar con fechas completas y zonas horarias correctas. Este ejemplo utiliza únicamente horarios simplificados.
Una limitación importante
El programa no conoce la ubicación geográfica.
Tampoco considera la fecha, la latitud ni la longitud. Por eso no puede determinar automáticamente la hora del amanecer.
Si quisiéramos desarrollar una aplicación completa, necesitaríamos incorporar cálculos astronómicos o una fuente externa de datos solares.
Para explorar información relacionada con estos fenómenos, existe el sitio Atardecer de Hoy.
¿Qué podríamos añadir después?
El siguiente paso sería trabajar con fechas reales y objetos datetime que incluyan información de zona horaria.
También podríamos guardar los resultados diarios en un archivo CSV y representar gráficamente cómo cambia la duración del día a lo largo de varios meses.
Sería un proyecto interesante para practicar Python, procesamiento de fechas y visualización de datos sin empezar con una aplicación demasiado compleja.
Conclusión
A veces, un ejercicio pequeño resulta suficiente para practicar conceptos útiles.
En este caso hemos utilizado datetime, operaciones con intervalos y divmod() para resolver un problema cotidiano.
Y lo mejor es que podemos reutilizar la función en otros proyectos que necesiten calcular diferencias entre horarios.
Top comments (0)