Package: openmeteo-requests
Open-Meteo API Python ClientThis ia an API client to get weather data from theOpen-Meteo Weather APIbased on the Python libraryrequests.Instead of using JSON, the API client uses FlatBuffers to transfer data. Encoding data in FlatBuffers is more efficient for long time-series data. Data can be transferred tonumpyorpandasusingZero-Copyto analyze large amount of data quickly. The schema definition files can be found onGitHub open-meteo/sdk.This library is primarily designed for data-scientists to process weather data. In combination with theOpen-Meteo Historical Weather APIdata from 1940 onwards can be analyzed quickly.Basic UsageThe following example gets an hourly temperature and precipitation forecast for Berlin. Additionally, the current temperature is retrieved. It is recommended to only specify the required weather variables.# pip install openmeteo-requestsimportopenmeteo_requestsfromopenmeteo_sdk.VariableimportVariableom=openmeteo_requests.Client()params={"latitude":52.54,"longitude":13.41,"hourly":["temperature_2m","precipitation"],"current":["temperature_2m"]}responses=om.weather_api("https://api.open-meteo.com/v1/forecast",params=params)response=responses[0]print(f"Coordinates{response.Latitude()}°E{response.Longitude()}°N")print(f"Elevation{response.Elevation()}m asl")print(f"Timezone{response.Timezone()}{response.TimezoneAbbreviation()}")print(f"Timezone difference to GMT+0{response.UtcOffsetSeconds()}s")# Current valuescurrent=response.Current()current_variables=list(map(lambdai:current.Variables(i),range(0,current.VariablesLength())))current_temperature_2m=next(filter(lambdax:x.Variable()==Variable.temperatureandx.Altitude()==2,current_variables))current_relative_humidity_2m=next(filter(lambdax:x.Variable()==Variable.relative_humidityandx.Altitude()==2,current_variables))print(f"Current time{current.Time()}")print(f"Current temperature_2m{current_temperature_2m.Value()}")print(f"Current relative_humidity_2m{current_relative_humidity_2m.Value()}")Note 1: You can also supply a list of latitude and longitude coordinates to get data for multiple locations. The API will return a array of results, hence in this example, we only consider the first location withresponse = responses[0].Note 2: Please note the function calls()for each attribute likeLatitude(). Those function calls are necessary due to the FlatBuffers format to dynamically get data from an attribute without expensive parsing.NumPyIf you are usingNumPyyou can easily get hourly or daily data asNumPyarray of type float.importnumpyasnphourly=response.Hourly()hourly_time=range(hourly.Time(),hourly.TimeEnd(),hourly.Interval())hourly_variables=list(map(lambdai:hourly.Variables(i),range(0,hourly.VariablesLength())))hourly_temperature_2m=next(filter(lambdax:x.Variable()==Variable.temperatureandx.Altitude()==2,hourly_variables)).ValuesAsNumpy()hourly_precipitation=next(filter(lambdax:x.Variable()==Variable.precipitation,hourly_variables)).ValuesAsNumpy()hourly_wind_speed_10m=next(filter(lambdax:x.Variable()==Variable.wind_speedandx.Altitude()==10,hourly_variables)).ValuesAsNumpy()PandasForPandasyou can prepare a data-frame from hourly data like follows:hourly_data={"date":pd.date_range(start=pd.to_datetime(hourly.Time(),unit="s"),end=pd.to_datetime(hourly.TimeEnd(),unit="s"),freq=pd.Timedelta(seconds=hourly.Interval()),inclusive="left")}hourly_data["temperature_2m"]=hourly_temperature_2mhourly_data["precipitation"]=hourly_precipitationhourly_data["wind_speed_10m"]=hourly_wind_speed_10mhourly_dataframe=pd.DataFrame(data=hourly_data)print(hourly_dataframe)#date  temperature_2m  precipitation#0  2023-08-01 00:00:00       16.945999            1.7#1  2023-08-01 01:00:00       16.996000            2.1#2  2023-08-01 02:00:00       16.996000            1.0#3  2023-08-01 03:00:00       16.846001            0.2Caching DataIf you are working with large amounts of data, caching data can make it easier to develop. You can pass a cached session from the libraryrequests-cacheto the Open-Meteo API client.The following example stores all data indefinitely (expire_after=-1) in a SQLite database called.cache.sqlite. For more options read therequests-cache documentation.Additionally,retry-requeststo automatically retry failed API calls in case there has been any unexpected network or server error.# pip install openmeteo-requests# pip install requests-cache retry-requestsimportopenmeteo_requestsimportrequests_cachefromretry_requestsimportretry# Setup the Open-Meteo API client with a cache and retry mechanismcache_session=requests_cache.CachedSession('.cache',expire_after=-1)retry_session=retry(cache_session,retries=5,backoff_factor=0.2)om=openmeteo_requests.Client(session=retry_session)# Using the client object `om` will now cache all weather dataTODODocument multi location/timeinterval usageDocument FlatBuffers data structureDocument time start/end/intervalDocument timezones behaviorDocument pressure level and upper levelDocument endpoints for air quality, etcConsider dedicated pandas library to convert responses quicklyLicenseMIT