# Accessing ERDDAP data with Python tools March 23rd, 2026 --- ## whoami ![tv-simpsons](https://hackmd.io/_uploads/rksLf15Kbx.gif) Filipe Fernandes I'm old school and prefer to use my own brain and skills to generate bad results instead of slop machines. --- Outline: - Quick intro to accessing data via web-interface - Building ERDDAP URLs with erddapy - Loading datasets with more specialized tools: `gliderpy`, `argopy`, and `xarray`. --- ## Live demo Let's find the gliders deployed in the west coast in the past week! - West Coast bounding box and time constraint: - `min_lon`, `max_lon` = -143, -117 - `min_lat`, `max_lat` = 32, 50 - `min_time` = "2026-03-09" [https://gliders.ioos.us/erddap/index.html](https://gliders.ioos.us/erddap/tabledap/allDatasets.html) --- ## The same(ish) with code: erddapy ```python from erddapy import ERDDAP e = ERDDAP( server="https://gliders.ioos.us/erddap", protocol="tabledap", ) ``` --- ## Searching ```python min_lon, max_lon = -143, -117 min_lat, max_lat = 32, 50 min_time = "2026-03-09" kw = { "min_lon": min_lon, "max_lon": max_lon, "min_lat": min_lat, "max_lat": max_lat, "min_time": min_time, } url = e.get_search_url(response="csv", **kw) ``` --- ## Downloading the data ```python e.variables = ["latitude", "longitude", "time"] def fetch_data(e, dataset_id): e.dataset_id = dataset_id return e.to_pandas( index_col="time (UTC)", parse_dates=True) gliders = {} for dataset_id in df["Dataset ID"]: gliders.update({dataset_id: fetch_data(e, dataset_id)}) ``` [Demo](http://127.0.0.1:8888/notebooks/erddapy_talk.ipynb#erddapy) --- ## Specialized clients: gliderpy ```python from gliderpy import GliderDataFetcher glider_grab = GliderDataFetcher() df = glider_grab.query( min_lat=min_lat, max_lat=max_lat, min_lon=min_lon, max_lon=max_lon, min_time=min_time, max_time=max_time, ) datasets = glider_grab.to_pandas() ``` [Demo](http://127.0.0.1:8888/notebooks/erddapy_talk.ipynb#gliderpy) --- ## Argopy, same but for argo data ```python from argopy import DataFetcher as ArgoDataFetcher ds = ArgoDataFetcher().region( [ min_lon, max_lon, min_lat, max_lat, 0, 200, min_time, max_time ] ).to_xarray() ``` [Demo](http://127.0.0.1:8888/notebooks/erddapy_talk.ipynb#argopy) --- ## Extras - [searvey](https://github.com/oceanmodeling/searvey) - [intake-erddap](https://github.com/axiom-data-science/intake-erddap) - [More on GitHub](https://github.com/ioos/erddapy/network/dependents?dependent_type=PACKAGE) --- ## What is an ERDDAP URL? ```python server = "https://gliders.ioos.us/erddap" protocol = "tabledap" dataset_id = "amelia-20180501T0000" response = ".ncCFMA" # .nc, .ncCF filters = "&trajectory&time>=2018-05-07T00:00:00Z" ``` ``` url = server / protocol / dataset_id → OPeNDAP url + response → File HTTP request url + response + filter → Same but with some constraints ``` --- ## I have the URL, just give me the data ```python import xarray as xr xr.backends.list_engines() ``` ```python dict_keys( [ 'netcdf4', 'h5netcdf', 'scipy', 'argo', 'erddapy', # <- Read all ERDDAP netcdf-like URLs ] ) ``` --- [Demo](http://127.0.0.1:8888/notebooks/erddapy_talk.ipynb#Using-ERDDAP-URLs-with-xarray) --- ## Questions? ![data](https://hackmd.io/_uploads/SyyCPEOcZg.jpg)
{"title":"Accessing ERDDAP data with Python tools","description":"Filipe FernandesMarço 9, 2026","contributors":"[{\"id\":\"88a8ebf5-fd29-4e3e-8264-ed4364e8c9cb\",\"add\":5267,\"del\":1861,\"latestUpdatedAt\":1774278325873}]"}
    105 views