import swisseph as swe
import pandas as pd
import numpy as np
import os
from datetime import datetime, timedelta
def calculate_lunar_days(start_year, end_year):
"""
Generates a DataFrame with Date, Sun_Lon, Moon_Lon, Phase_Angle, Tithi (1-30), Moon_Sign (0-11).
"""
start_date = datetime(start_year, 1, 1)
end_date = datetime(end_year, 12, 31)
days = (end_date - start_date).days + 1
dates = []
tithis = []
phases = []
moon_signs = []
sun_signs = []
print(f"Calculating lunar metrics for {days} days between {start_year} and {end_year}...")
for i in range(days):
current_date = start_date + timedelta(days=i)
dates.append(current_date.strftime('%Y-%m-%d'))
# Noon UTC
jd = swe.julday(current_date.year, current_date.month, current_date.day, 12.0)
# Calculate Sun and Moon positions
sun_res = swe.calc_ut(jd, swe.SUN)
moon_res = swe.calc_ut(jd, swe.MOON)
sun_lon = sun_res[0][0]
moon_lon = moon_res[0][0]
# Calculate Phase Angle (0-360) where 0 is New Moon
phase_angle = (moon_lon - sun_lon) % 360
phases.append(phase_angle)
# Calculate Tithi (1-30)
tithi = int(phase_angle / 12) + 1
tithis.append(tithi)
# Calculate Signs (0 = Aries, 1 = Taurus, ...)
moon_sign = int(moon_lon / 30)
sun_sign = int(sun_lon / 30)
moon_signs.append(moon_sign)
sun_signs.append(sun_sign)
df = pd.DataFrame({
'date': dates,
'phase_angle': phases,
'tithi': tithis,
'moon_sign': moon_signs,
'sun_sign': sun_signs
})
return df
if __name__ == "__main__":
# Generate for a wide range to cover historical weather data if needed
df = calculate_lunar_days(1900, 2024)
output_path = os.path.join(os.path.dirname(__file__), 'lunar_data.csv')
df.to_csv(output_path, index=False)
print(f"Saved lunar data to {output_path}")