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, snow products, climate
reanalysis, DEMs and a hillshade, basins, and boundaries from countries and
counties to mountain ranges and glacier outlines — under a consistent API that
returns xarray objects (and GeoDataFrames for vector products). 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.
What a probe cannot see — a reprocessed collection, a republished file, a new
release (the next Census year, a new RGI version) — is caught by a weekly
upstream watch that opens one digest issue labelled
upstream-watch
and closes the previous one, carrying its unticked to-dos forward. The same
digest lists datasets nobody has told us about yet: new snow, ice and frozen-ground
collections in NASA's CMR, and new collections on Planetary Computer, Earth Search
and both Earth Engine catalogs, under "Worth adding" when they are about the
cryosphere.
Last updated: 2026-10-26 08:22 UTC
⚠️ = skipped (credentials not available in this run). Latency and virtualization probes are on the status page.
Stations (esd.stations)
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| AWDB stations (NRCS REST API) | ✅ | ✅ | ✅ | ✅ |
| CDEC stations (JSON data servlet) | ✅ | ✅ | ✅ | ✅ |
| BC snow stations (DataBC WFS) | ✅ | ✅ | ✅ | ✅ |
| NVE stations (HydAPI) | ✅ | ✅ | ✅ | ✅ |
| Yukon stations (AquaCache API) | ✅ | ✅ | ✅ | ✅ |
| Snow station Zarr archive (global_snow_networks) | ✅ | ✅ | ✅ | ✅ |
| 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 (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| 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 (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| 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 (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| HLS L30 (CMR-STAC LPCLOUD) | ✅ | ✅ | ✅ | ✅ |
| HLS S30 (CMR-STAC LPCLOUD) | ✅ | ✅ | ✅ | ✅ |
| HLS L30 COG read (CMR-STAC LPCLOUD, Earthdata Login) | ✅ | ✅ | ✅ | ✅ |
| HLS S30 COG read (CMR-STAC LPCLOUD, Earthdata Login) | ✅ | ✅ | ✅ | ✅ |
| HLS L30 (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| HLS S30 (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| PlanetScope (Planet Data API) | ✅ | ✅ | ✅ | ✅ |
| Sentinel-2 L2A (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| Sentinel-2 L2A (Earth Search) | ✅ | ✅ | ✅ | ✅ |
Terrain (esd.terrain)
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| CHILI (GEE/CSP ERGo) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Earth Search) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| Copernicus DEM (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
| NASADEM (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| NASADEM (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| NASADEM (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
| SRTM GL1 (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
| SRTM GL1 (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| 3DEP seamless (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| 3DEP 10 m (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| ALOS World 3D (Planetary Computer) | ✅ | ✅ | ✅ | ✅ |
| ALOS World 3D (Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| ALOS World 3D (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
| GEDTM30 (OpenTopography) | ✅ | ✅ | ✅ | ✅ |
| Natural Earth hillshade (S3) | ✅ | ✅ | ✅ | ✅ |
Land cover (esd.land)
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| 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 (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| 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 | ✅ | ✅ | ✅ | ✅ |
Boundaries (esd.boundaries)
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| Natural Earth countries (naciscdn) | ✅ | ✅ | ✅ | ✅ |
| geoBoundaries countries (ADM0, gbOpen) | ✅ | ✅ | ✅ | ✅ |
| Natural Earth states and provinces (naciscdn) | ✅ | ✅ | ✅ | ✅ |
| US Census states (cartographic boundaries) | ✅ | ✅ | ✅ | ✅ |
| geoBoundaries states and provinces (ADM1, gbOpen) | ✅ | ✅ | ✅ | ✅ |
| US Census counties (cartographic boundaries) | ✅ | ✅ | ✅ | ✅ |
| geoBoundaries admin units (ADM2, gbOpen) | ✅ | ✅ | ✅ | ✅ |
| RGI 7.0 glacier outlines (NSIDC) | ✅ | ✅ | ✅ | ✅ |
| RGI 6.0 glacier outlines (NSIDC) | ✅ | ✅ | ✅ | ✅ |
| RGI 6.0 glacier outlines (OGGM mirror) | ✅ | ✅ | ✅ | ✅ |
| GMBA mountains (EarthEnv) | ✅ | ✅ | ✅ | ✅ |
| Natural Earth vector layers (naciscdn) | ✅ | ✅ | ✅ | ✅ |
Climate (esd.climate)
| Data Source | Latest (Oct 26) | Oct 19 | Oct 12 | Oct 5 |
|---|---|---|---|---|
| ARCO-ERA5 (GCS anonymous) | ✅ | ✅ | ✅ | ✅ |
| ERA5 (Google Earth Engine) | ✅ | ✅ | ✅ | ✅ |
| Climate indices (CPC RONI) | ✅ | ✅ | — | — |
| Climate indices (NCEI PDO) | ✅ | ✅ | — | — |
| Climate indices (PSL MEI.v2) | ✅ | ✅ | — | — |
| Climate indices (PSL pdo.data) | ✅ | ✅ | — | — |
| 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 --all # every environment (plain `pixi install` sets up only the default one)
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-fast # build the site without running the gallery
pixi run -e docs docs-serve # serve the built site at http://localhost:8000
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_USERNAME + EARTHDATA_PASSWORD (recommended), a ~/.netrc entry from earthaccess.login(persist=True), or EARTHDATA_TOKEN. A token alone does not reach NSIDC's on-premises files (RGI glacier outlines, the NSIDC-0768 snow classification) or ASF's OPERA datapool, and user tokens expire after about 60 days |
urs.earthdata.nasa.gov |
| NVE HydAPI (Norwegian stations) | NVE_API_KEY |
hydapi.nve.no |
RIHMI АИСОРИ-М (Russian snow surveys, RIHMIClient) |
AISORI_USERNAME + AISORI_PASSWORD |
aisori-m.meteo.ru |
| Planet (PlanetScope, commercial) | PL_API_KEY, or planet auth login |
planet.com |
35 of the 41 products have at least one route that needs no account; each product's catalog page says which.
What is in it
42 products across 9 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, gedtm30, hillshade, nasadem, srtm |
7 of 8 |
| land | esa-worldcover, forest-cover-fraction, nlcd |
2 of 3 |
| hydro | grdc-major-river-basins, grdc-wmo-basins, huc, hydrobasins |
4 of 4 |
| boundaries | admin-boundaries, countries, gmba-mountains, natural-earth-vectors, rgi-glaciers, states-provinces, us-counties |
7 of 7 |
| climate | climate-indices, era5, koppen-geiger |
3 of 3 |
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_gdf = esd.stations.inventory(aoi, daily_only=True)
obs_ds = esd.stations.load(inv_gdf, variables=["swe", "snwd"], time="2023-10/2024-09")
# Terrain, SAR, and snow water equivalent — lazy, Dask-backed, CRS attached
dem_da = esd.terrain.dem.load(aoi) # Copernicus GLO-30 (default)
dem_da = esd.terrain.dem.load(aoi, product="3dep") # or NASADEM, SRTM, 3DEP, ALOS
dem_da = esd.terrain.dem.load(aoi, product="gedtm30") # global bare-earth DTM (OpenTopography)
s1_ds = esd.sar.sentinel1.load(aoi, "2024-03", units="dB") # Sentinel-1 RTC
snodas_ds = esd.snow.snodas.load(aoi, "2024-03") # SNODAS, no account
# Boundaries as GeoDataFrames: states, counties, mountain ranges, glaciers
wa_gdf = esd.boundaries.admin.states(aoi) # Washington (US Census)
ranges_gdf = esd.boundaries.mountains.load(aoi) # GMBA Mountain Inventory v2
glaciers_gdf = esd.boundaries.glaciers.load(aoi) # RGI 7.0 (Earthdata username + password); RGI 6.0 from source="oggm-mirror" needs none
# Optical, masked, and a snow index written out rather than hidden in a helper
s2_ds = esd.optical.sentinel2.load(aoi, "2024-03", mask="scl-default")
ndsi_da = (s2_ds["green"] - s2_ds["swir16"]) / (s2_ds["green"] + s2_ds["swir16"])
# Maps with equal aspect, a scale bar, and a graticule; legends from CF flags
ax = esd.plotting.map(dem_da, cmap="terrain")
esd.plotting.add_outline(ax, glaciers_gdf) # vectors in the map's CRS
esd.plotting.categorical(esd.land.landcover.load(aoi))
esd.plotting.timeseries(obs_ds["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.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| easysnowdata-0.3.4.tar.gz | 988.9 kB | Without provenance | Details for easysnowdata-0.3.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| easysnowdata-0.3.4-py3-none-any.whl | Python 3 | none | any | Details for easysnowdata-0.3.4-py3-none-any.whl |
Total release size: 1.6 MB
Release files / easysnowdata-0.3.4.tar.gz
| Download URL | easysnowdata-0.3.4.tar.gz |
|---|---|
| Size | 988.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
20734b832b788fd988db350a2417390a256674da14df998eb96de4d4f10e335d
|
|
BLAKE2b-256 checksum How to use checksums |
94cbecba26ed9696bd0b7f6da6368e6adcd3d6ef91c3f6e3a6cf15ddc2a950b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / easysnowdata-0.3.4-py3-none-any.whl
| Download URL | easysnowdata-0.3.4-py3-none-any.whl |
|---|---|
| Size | 606.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
176fc0b312b3b5a84359a1a356fac6d95b47d8dfd93d38f7f08b42568d2089fd
|
|
BLAKE2b-256 checksum How to use checksums |
15fd2c5b4571ed8c80596302f2a8ed4bf399fb7036d5adbddfd001aa54433620
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Security for easysnowdata 0.3.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.