import numpy as np import matplotlib.pyplot as plt import ephem from datetime import datetime import streamlit as st def get_moon_phase(date=None): # Si no se proporciona una fecha, usa la actual if date is None: now = datetime.now() else: now = datetime.strptime(date, "%Y-%m-%d") now = now.replace(hour=12, minute=0, second=0) # Configura la hora a las 12:00 date_str = now.strftime("%Y-%m-%d %H:%M:%S") # Extrae detalles de la fecha day = now.day month = now.strftime("%B") year = now.year hour = now.strftime("%H:%M:%S") # Calcula la fase lunar moon = ephem.Moon() observer = ephem.Observer() observer.date = now moon.compute(observer) # Determina la fase lunar phase = moon.phase # Fase lunar en grados phase_name = '' if phase < 1: phase_name = 'Nueva' elif phase < 49: phase_name = 'Creciente' elif phase < 51: phase_name = 'Llena' else: phase_name = 'Menguante' return phase_name, phase, date_str, day, month, year, hour def draw_moon_phase(phase, day, month, year, hour): fig, ax = plt.subplots(figsize=(6, 6)) # Color oscuro para fondo igual que el círculo de la luna dark_color = '#001f3f' # Color oscuro para simular la noche ax.set_facecolor(dark_color) # Dibuja la fase de la luna ax.set_xlim(-1, 1) ax.set_ylim(-1, 1) # Crea un círculo para la luna moon_circle = plt.Circle((0, 0), 0.5, color='#FFEB3B', zorder=1, edgecolor='gold', linewidth=2) # Color amarillo suave y borde dorado # Crea el sombreado según la fase lunar if phase == 'Nueva': ax.add_artist(moon_circle) elif phase == 'Creciente': crescent = plt.Circle((0.2, 0), 0.5, color=dark_color, zorder=2) # Color del fondo ax.add_artist(moon_circle) ax.add_artist(crescent) elif phase == 'Llena': ax.add_artist(moon_circle) elif phase == 'Menguante': crescent = plt.Circle((-0.2, 0), 0.5, color=dark_color, zorder=2) # Color del fondo ax.add_artist(moon_circle) ax.add_artist(crescent) ax.set_aspect('equal') ax.axis('off') # Oculta los ejes ax.set_title(f"Fase de la Luna: {phase}", fontsize=16, color='white', fontweight='bold', family='sans-serif') # Información organizada con sombras y esquinas redondeadas ax.text(0, -0.8, f"Fecha: {day} {month} {year}", ha='center', fontsize=12, color='black', fontweight='light') # Cambiado a color negro mate ax.text(0, -0.9, f"Hora: {hour}", ha='center', fontsize=12, color='black', fontweight='light') # Cambiado a color negro mate # Añadir una sombra al texto ax.text(0, -0.8, f"Fecha: {day} {month} {year}", ha='center', fontsize=12, color='black', alpha=0.5, fontweight='light', zorder=0) ax.text(0, -0.9, f"Hora: {hour}", ha='center', fontsize=12, color='black', alpha=0.5, fontweight='light', zorder=0) # Añadir un toque decorativo ax.plot([-1, 1], [1, 1], color='white', linewidth=3) # Línea decorativa en la parte superior return fig def season(month): if month in ["December", "January", "February"]: return "Invierno" elif month in ["March", "April", "May"]: return "Primavera" elif month in ["June", "July", "August"]: return "Verano" else: return "Otoño" # Configuración de la aplicación Streamlit st.set_page_config(page_title="Fase Lunar", layout="centered") # Cambiar el color de fondo de la página dark_color = '#001f3f' # Color oscuro para simular la noche st.markdown(f"", unsafe_allow_html=True) # Obtener la fase lunar para hoy al iniciar phase_name, phase_degree, date_str, day, month, year, hour = get_moon_phase() current_season = season(month) # Mostrar la información de la luna st.title("Fase Lunar") st.write(f"Fecha: {day} {month} {year}, Hora: {hour}") st.write(f"Fase lunar: {phase_name} (Grados: {phase_degree:.2f})") st.write(f"Estación: {current_season}") # Selector de fecha selected_date = st.date_input("Seleccionar fecha:", datetime.now().date()) # Botón para calcular la fase lunar de la fecha seleccionada if st.button("Mostrar Fase Lunar"): phase_name, phase_degree, date_str, day, month, year, hour = get_moon_phase(selected_date.strftime('%Y-%m-%d')) current_season = season(month) # Actualiza la información mostrada st.write(f"Fecha: {day} {month} {year}, Hora: {hour}") st.write(f"Fase lunar: {phase_name} (Grados: {phase_degree:.2f})") st.write(f"Estación: {current_season}") # Dibuja la fase de la luna fig = draw_moon_phase(phase_name, day, month, year, hour) # Muestra la figura en Streamlit st.pyplot(fig)