Discovering Meteostat: Historical Weather API in Python
Historical Weather in Python
Weather plays a crucial role in many domains, from planning outdoor activities to optimizing business operations.
Historical weather data provides valuable insights into past weather patterns and trends, allowing us to understand climate variations and make informed decisions.
As I am building an interactive weather trip planner application to show historical weather patterns to plan my trips, I needed reliable and comprehensive weather data and that led me to discover the Meteostat library in Python.
In this blog post, I will show you how to use Meteostat library into your Python applications with the use of its simple API, so that you can also access and display historical weather data for your projects.
Meteostat - Weather API in python
Meteostat is a weather data provider that offers a free API to access historical weather data. The Meteostat API allows us to retrieve weather information such as temperature, precipitation, wind speed, and other meteorological parameters for specific locations around the world.
- The Meteostat project in Github
- Meteostat documentation - Data Sources
Getting Started with Meteostat API for Python
First, we need to install the meteostat package:
pip install meteostat
Now, we can import meteostat as a Python library:
import meteostat
print(f'Meteostat version: {meteostat.__version__}') #check the installed version
Ok, now that everything is setup, lets explore Meteostat API a little further.
Exploring Meteostat API Features - Examples
To retrieve weather data using the Meteostat API, you typically need to provide the location (latitude and longitude) and the desired time period for which you want to obtain the data.
The API supports various parameters for specifying the location, time range, and other options.
Meteostat - Historical Weather in a Location
Let’s make one sample query to Meteostat, particularly to the Point Class - we will need:
- Latitude
- Longitude
- Time Range
- Outputs - Weather attributes: Temperatures, Wind…
from meteostat import Point, Daily
from datetime import datetime
import plotly.express as px
# Set time period
start = datetime(2022, 1, 1)
end = datetime(2022, 12, 31)
# Create Point (KOS island in Greece)
#location = Point(36.8925871 , 27.2877926, 70) #lat, long, altitude (optional)
location = Point(36.8925871 , 27.2877926)
# Get daily data
data = Daily(location, start, end)
data = data.fetch()
In the output dataframe, we are getting several attributes, like: tavg, tmin, tmax, prcp, snow, wdir, wspd, wpgt, pres, tsun
You will observe that we dont have data available in all the given locations…, for example:
### The Point Class: latitude, longitude, altitude
#https://dev.meteostat.net/python/point.html
from meteostat import Point, Daily
from datetime import datetime
import plotly.express as px
# Set time period
start = datetime(2022, 1, 1)
end = datetime(2022, 12, 31)
# Create Point (near Istambul in Turkey)
location = Point(40 , 30)
# Get daily data
data = Daily(location, start, end)
data = data.fetch()
print(data) #no data is queried
print(type(data))
…but we can of course tweak that.
Meteostat - Nearest Stations to the given Location
But there is no need to worry - we can still get the nearest data to our desired location.
For that, we need to use the class Stations of Meteostat and provide:
- Latitude
- Longitude
from meteostat import Stations
# Get nearby weather stations
stations = Stations()
stations = stations.nearby(40 , 30)
station = stations.fetch(1)
nearest_lat = station['latitude'].values[0]
nearest_lon = station['longitude'].values[0]
With this approach, I am getting the closest station to the desired location (and we can feed that as corrected input of the Point Class).
Python Weather - Use case: Trip-Planner
Based on the Meteostat library and supported by Plotly and DASH projects, I am building an intereactive application that will display the historical weather data from Meteostat to an interactive Map (where the user can select the desired location).
- The project repository is at my Github