easysnowdata
A Python package to easily retrieve data relevant to snow science.
easysnowdata unifies access to a wide range of snow-relevant geospatial
datasets — weather stations, satellite imagery, climate reanalysis, DEMs, and
more — under a consistent API that returns xarray objects. The emphasis is on
minimising downloads and local computation by leveraging cloud-optimised data
formats wherever possible.
Gallery
One executed script per product — browse them, each with the code, the figure and a downloadable notebook.
Data Source Status
Every route of every product is probed weekly. A failure opens an issue
labelled data-source
and a recovery closes it; latency and DMR++ readiness are on the
status page.
Last updated: 2026-09-22 01:46 UTC
⚠️ = skipped (credentials not available in this run). Latency and virtualization probes are on the status page.
Stations (esd.stations)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| AWDB stations (NRCS REST API) | ✅ | ✅ | — | — |
| CDEC stations (JSON data servlet) | ✅ | ✅ | — | — |
| BC snow stations (DataBC WFS) | ✅ | ✅ | — | — |
| NVE stations (HydAPI) | ❌ | ⚠️ | — | — |
| Yukon stations (AquaCache API) | ✅ | ✅ | — | — |
| Snow station inventory (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
| Snow station archive tarball (global_snow_networks) | ✅ | ✅ | — | — |
| Snow station CSV (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
Snow (esd.snow)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| MODIS snow cover MOD10A1F (NASA NSIDC) | ✅ | ✅ | — | — |
| MODIS snow cover MOD10A1 (Planetary Computer) | ✅ | ✅ | — | — |
| Mountain snow mask (Zenodo) | ✅ | ✅ | ✅ | ✅ |
| SNODAS (NSIDC G02158) | ✅ | ✅ | — | — |
| SNODAS (GEE/Climate Engine) | ✅ | ✅ | ✅ | ✅ |
| Sturm & Liston snow classification (NSIDC-0768) | ✅ | ✅ | — | — |
| Sturm & Liston snow classification (Azure) | ✅ | ✅ | ✅ | ✅ |
| UCLA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | ⚠️ | ⚠️ |
| HMA Snow Reanalysis (NASA NSIDC) | ✅ | ✅ | — | — |
| VIIRS snow cover VNP10A1F (NASA NSIDC) | ✅ | ✅ | — | — |
SAR (esd.sar)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| Sentinel-1 RTC (Planetary Computer) | ✅ | ✅ | — | — |
| Sentinel-1 RTC OPERA (CMR-STAC ASF) | ✅ | ✅ | — | — |
| Sentinel-1 RTC OPERA (Earth Engine) | ✅ | ✅ | — | — |
| Sentinel-1 static layers (CMR-STAC ASF) | ✅ | ✅ | — | — |
| Copernicus DEM for the incidence angle (Planetary Computer) | ✅ | ✅ | — | — |
| Sentinel-1 GRD angle band (Earth Engine) | ✅ | ✅ | — | — |
Optical imagery (esd.optical)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| HLS L30 (CMR-STAC LPCLOUD) | ✅ | ✅ | — | — |
| HLS S30 (Planetary Computer) | ✅ | ✅ | — | — |
| PlanetScope (Planet Data API) | ❌ | ⚠️ | — | — |
| Sentinel-2 L2A (Planetary Computer) | ✅ | ✅ | — | — |
| Sentinel-2 L2A (Earth Search) | ✅ | ✅ | — | — |
Terrain (esd.terrain)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Earth Search) | ✅ | ✅ | — | — |
Land cover (esd.land)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| Forest cover fraction (Zenodo) | ✅ | ✅ | ✅ | ✅ |
| Forest cover fraction (GEE/CGLS-LC100) | ✅ | ✅ | — | — |
| ESA WorldCover (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| ESA WorldCover (AWS bucket) | ✅ | ✅ | — | — |
| Annual NLCD (GEE community asset) | ✅ | ✅ | — | — |
| NLCD (GEE/USGS) | ✅ | ✅ | ✅ | ✅ |
Hydrography (esd.hydro)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| HUC geometries (USGS WBD REST) | ✅ | ✅ | — | — |
| HUC geometries (GEE/USGS WBD) | ✅ | ✅ | ✅ | ✅ |
| HydroATLAS basins (figshare) | ✅ | ✅ | ✅ | ✅ |
| HydroBASINS (HydroSHEDS regional zip) | ❌ | ✅ | — | — |
| HydroBASINS (GEE/HydroATLAS) | ✅ | ✅ | — | — |
| GRDC major river basins (World Bank) | ✅ | ✅ | ✅ | ✅ |
| GRDC WMO basins | ✅ | ❌ | ❌ | ❌ |
Climate (esd.climate)
| Data Source | Latest (Sep 21) | Sep 17 | Sep 14 | Sep 7 |
|---|---|---|---|---|
| ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
| ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| Köppen-Geiger classification (figshare) | ✅ | ✅ | ✅ | ✅ |
Installation
pip install easysnowdata
conda install -c conda-forge easysnowdata
mamba install -c conda-forge easysnowdata
Development install (with pixi)
git clone https://github.com/egagli/easysnowdata.git
cd easysnowdata
pixi install # sets up the environments
pixi run -e test-py313 test-unit # offline tests (no network, no credentials)
pixi run -e test-py313 test-live # live tests against the data providers (credentialed ones skip without secrets)
pixi run -e docs docs-serve # preview the docs locally
Services that require account setup
Some data sources need free accounts and credentials passed as environment variables:
| Service | Env vars | Sign-up |
|---|---|---|
| Google Earth Engine | EARTHENGINE_TOKEN (or ~/.config/earthengine/credentials from ee.Authenticate()) |
earthengine.google.com |
| NASA Earthdata | EARTHDATA_TOKEN (recommended), or EARTHDATA_USERNAME + EARTHDATA_PASSWORD, or a ~/.netrc entry from earthaccess.login(persist=True) |
urs.earthdata.nasa.gov |
Planetary Computer and anonymous GCS access require no credentials.
What is in it
32 products across 8 themes, each with one or more access routes:
| theme | products | open without an account |
|---|---|---|
| stations | awdb-stations, cdec-stations, databc-stations, nve-stations, snow-station-archive, yukon-stations |
5 of 6 |
| snow | modis-snow, mountain-snow-mask, snodas, snow-classification, ucla-snow-reanalysis, viirs-snow |
4 of 6 |
| sar | sentinel-1-local-incidence-angle, sentinel-1-rtc |
2 of 2 |
| optical | hls, planetscope, sentinel-2-l2a |
2 of 3 |
| terrain | 3dep, alos-dem, chili, copernicus-dem, nasadem, srtm |
4 of 6 |
| land | esa-worldcover, forest-cover-fraction, nlcd |
2 of 3 |
| hydro | grdc-major-river-basins, grdc-wmo-basins, huc, hydrobasins |
4 of 4 |
| climate | era5, koppen-geiger |
2 of 2 |
Every product's routes, resolution, credentials, licence and health are on its own page: https://egagli.github.io/easysnowdata/catalog/.
Quick Start
import easysnowdata as esd
aoi = (-121.94, 46.72, -121.54, 46.99) # Mount Rainier; any AOI form works
# Snow stations: which are here, then one water year of observations
inv = esd.stations.inventory(aoi, daily_only=True)
obs = esd.stations.load(inv, variables=["swe", "snwd"], time="2023-10/2024-09")
# Terrain, SAR and snow water equivalent — lazy, Dask-backed, CRS attached
dem = esd.terrain.dem.load(aoi) # Copernicus GLO-30 (default)
dem = esd.terrain.dem.load(aoi, product="3dep") # or NASADEM, SRTM, 3DEP, ALOS
s1 = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
swe = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
# Optical, masked, and a snow index written out rather than hidden in a helper
s2 = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
ndsi = (s2["green"] - s2["swir16"]) / (s2["green"] + s2["swir16"])
# Maps with equal aspect, a scale bar and a graticule; legends from CF flags
esd.plotting.map(dem, cmap="terrain")
esd.plotting.categorical(esd.land.landcover.load(aoi))
esd.plotting.timeseries(obs["swe"]) # calendar dates, units in [ ]
# What is available, and what it needs
esd.catalog.search("swe")
esd.catalog.describe("snodas")
esd.auth.status()
Coming from 0.0.x? The old module API (remote_sensing.get_*,
automatic_weather_stations.StationCollection, …) was deprecated in 0.2 and
removed in 0.3; the migration guide
maps every old name to its replacement.
Documentation
Executed example gallery, data catalog and API reference: https://egagli.github.io/easysnowdata
Contributing
Contributions welcome! See CONTRIBUTING for guidelines.
Citing
If you use easysnowdata in your research, please cite the Zenodo archive:
Metadata
Release files for easysnowdata 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| easysnowdata-0.3.2.tar.gz | 630.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| easysnowdata-0.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 970.3 kB
Release files / easysnowdata-0.3.2.tar.gz
| Download URL | easysnowdata-0.3.2.tar.gz |
|---|---|
| Size | 630.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
77b0b85f0e5433113d180511cdb1b4202f862f48474f85e20fb842c41ff0c124
|
|
BLAKE2b-256 checksum How to use checksums |
cdbc8f0f5ccee7ad350169364781ce9ffeccf6961769c0b445312838806eb747
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / easysnowdata-0.3.2-py3-none-any.whl
| Download URL | easysnowdata-0.3.2-py3-none-any.whl |
|---|---|
| Size | 340.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ccd3e07c67d5d6254ba2178929b2312f0b5e78c7943c00d49f708fcebe97318
|
|
BLAKE2b-256 checksum How to use checksums |
52170fa0dfb17e44fda1cb7f7cb690405f1e948cff4538f53c2fc633b4f77f70
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|