import openmeteo_requests import requests_cache import pandas as pd from retry_requests import retry # Setup the Open-Meteo API client with cache and retry on error cache_session = requests_cache.CachedSession('.cache', expire_after=3600) retry_session = retry(cache_session, retries=5, backoff_factor=0.2) openmeteo = openmeteo_requests.Client(session=retry_session) def get_info_meteo(latitude, longitude): """Function that creates a Json file containing the weather data of the location ARGS: latitude (Float) : latitude coordinate longitude (Float): longitude coordinate """ url = "https://api.open-meteo.com/v1/forecast" params = { "latitude": latitude, "longitude": longitude, # "cloud_cover_low", "cloud_cover_mid","cloud_cover_high" "hourly": {"relative_humidity_2m", "soil_temperature_0cm", "soil_moisture_0_to_1cm", "cloud_cover"}, "daily": {"temperature_2m_max", "precipitation_sum", "wind_speed_10m_max", "sunshine_duration", "rain_sum"}, "past_days": 5, "forecast_days": 7 } responses = openmeteo.weather_api(url, params=params) response = responses[0] # Hourly dataframe hourly = response.Hourly() hourly_relative_humidity_2m = hourly.Variables(0).ValuesAsNumpy() hourly_soil_temperature_0cm = hourly.Variables(1).ValuesAsNumpy() hourly_soil_moisture_0_to_1cm = hourly.Variables(2).ValuesAsNumpy() hourly_cloud_cover = hourly.Variables(3).ValuesAsNumpy() hourly_data = {"date": pd.date_range( start=pd.to_datetime(hourly.Time(), unit="s", utc=True), end=pd.to_datetime(hourly.TimeEnd(), unit="s", utc=True), freq=pd.Timedelta(seconds=hourly.Interval()), inclusive="left" )} hourly_data["relative_humidity_2m_%"] = hourly_relative_humidity_2m hourly_data["soil_temperature_0cm_C"] = hourly_soil_temperature_0cm hourly_data["soil_moisture_0_to_1cm_m³"] = hourly_soil_moisture_0_to_1cm hourly_data["cloud_cover_%"] = hourly_cloud_cover hourly_dataframe = pd.DataFrame(data=hourly_data) hourly_dataframe = pd.DataFrame(data=hourly_data) # Average hourly data per day hourly_dataframe['day_date'] = hourly_dataframe['date'].dt.strftime( '%Y-%m-%d') tmp1 = hourly_dataframe.groupby('day_date')[ ['relative_humidity_2m_%', 'soil_temperature_0cm_C', 'soil_moisture_0_to_1cm_m³']].mean() avg_hourly_dataframe = tmp1.rename(columns={ 'relative_humidity_2m_%': 'avg_hourly_relative_humidity_2m_%', 'soil_temperature_0cm_C': 'avg_hourly_soil_temperature_0cm_C', 'soil_moisture_0_to_1cm_m³': 'avg_hourly_soil_moisture_0_to_1cm_m³' } ) # med cloud couverture tmp2 = hourly_dataframe.groupby('day_date')[['cloud_cover_%']].median() med_cloud_cover = tmp2.rename( columns={'cloud_cover_%': 'med_cloud_cover_%'}) # Daily dataframe daily = response.Daily() daily_temperature_2m_max = daily.Variables(0).ValuesAsNumpy() print(daily_temperature_2m_max) daily_precipitation_sum = daily.Variables(1).ValuesAsNumpy() daily_wind_speed_10m_max = daily.Variables(2).ValuesAsNumpy() daily_sunshine_duration = daily.Variables(3).ValuesAsNumpy() daily_rain_sum = daily.Variables(4).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='D', inclusive="left" )} daily_data["daily_temperature_2m_max_C"] = daily_temperature_2m_max daily_data["daily_precipitation_sum_mm"] = daily_precipitation_sum daily_data["daily_wind_speed_10m_max_km/h"] = daily_wind_speed_10m_max daily_data["daily_sunshine_duration_sec"] = daily_sunshine_duration daily_data["daily_rain_sum_mm"] = daily_rain_sum daily_dataframe = pd.DataFrame(data=daily_data) daily_dataframe['day_date'] = daily_dataframe['date'].dt.strftime( '%Y-%m-%d') total_df = pd.merge(daily_dataframe, avg_hourly_dataframe, on="day_date", how="left") total_df = pd.merge(total_df, med_cloud_cover, on="day_date", how="left") total_df['date'] = total_df['day_date'] total_df = total_df.drop('day_date', axis=1) total_df.to_json("weather_data.json", orient='columns') return total_df if __name__ == "__main__": df = get_info_meteo(48.832, 2.286) print(df)