import openmeteo_requests import requests_cache import pandas as pd from retry_requests import retry def download_historical_weather_data( latitude: float, longitude: float, start_year: int, end_year: int, ) -> pd.DataFrame: # Setup the Open-Meteo API client with cache and retry on error cache_session = requests_cache.CachedSession('.cache', expire_after = -1) retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2) openmeteo = openmeteo_requests.Client(session = retry_session) # Make sure all required weather variables are listed here # The order of variables in hourly or daily is important to assign them correctly below url = "https://archive-api.open-meteo.com/v1/archive" params = { "latitude": latitude, "longitude": longitude, "start_date": f"{start_year}-01-01", "end_date": f"{end_year}-12-31", "daily": ["temperature_2m_max", "temperature_2m_min", "temperature_2m_mean", "precipitation_sum", "precipitation_hours", "shortwave_radiation_sum", "et0_fao_evapotranspiration"], "timezone": "GMT" } responses = openmeteo.weather_api(url, params=params) # Process first location. Add a for-loop for multiple locations or weather models response = responses[0] print(f"Coordinates {response.Latitude()}°N {response.Longitude()}°E") print(f"Elevation {response.Elevation()} m asl") print(f"Timezone {response.Timezone()} {response.TimezoneAbbreviation()}") print(f"Timezone difference to GMT+0 {response.UtcOffsetSeconds()} s") # Process daily data. The order of variables needs to be the same as requested. daily = response.Daily() daily_temperature_2m_max = daily.Variables(0).ValuesAsNumpy() daily_temperature_2m_min = daily.Variables(1).ValuesAsNumpy() daily_temperature_2m_mean = daily.Variables(2).ValuesAsNumpy() daily_precipitation_sum = daily.Variables(3).ValuesAsNumpy() daily_precipitation_hours = daily.Variables(4).ValuesAsNumpy() daily_shortwave_radiation_sum = daily.Variables(5).ValuesAsNumpy() daily_et0_fao_evapotranspiration = daily.Variables(6).ValuesAsNumpy() daily_data = { "date": pd.date_range( start=pd.to_datetime(daily.Time(), unit="s", utc=True), end=pd.to_datetime(daily.TimeEnd(), unit="s", utc=True), freq=pd.Timedelta(seconds=daily.Interval()), inclusive="left" ), "temperature_2m_max": daily_temperature_2m_max, "temperature_2m_min": daily_temperature_2m_min, "temperature_2m_mean": daily_temperature_2m_mean, "precipitation_sum": daily_precipitation_sum, "precipitation_hours": daily_precipitation_hours, "shortwave_radiation_sum": daily_shortwave_radiation_sum, "et0_fao_evapotranspiration": daily_et0_fao_evapotranspiration } daily_dataframe = pd.DataFrame(data = daily_data) return daily_dataframe