The USDA Natural Resources Conservation Service's automated snow and soil station networks (SNOTEL snow telemetry, its SNOWLITE satellites, and SCAN soil climate) as a self-contained cloud-native archive: the complete daily observational record with NRCS's quality-control history on every row, the station map, the sensor inventory, and the 30-year normals. Everything needed to use these networks without touching an API.
145 million daily values across 1,219 telemetry stations, 184 MB total. Thirteen elements: WTEQ (snow water equivalent, inches), SNWD (snow depth), SNDN (snow density, pct), SNRR (snow/rain ratio), PREC (accumulated precipitation), PRCP (daily precipitation increment), PRCPSA (snow-adjusted increment), TOBS / TMAX / TMIN / TAVG (air temperature, °F), and, at every installed sensor depth, SMS (soil moisture, pct) and STO (soil temperature, °F). Values as served by the AWDB REST API v1; no resampling, no gap filling. Where NRCS revised a reading during quality control, both the current and the original value are here.
Both daily files share one long schema: station_triplet, network, state, element,
depth_in (int16, inches below surface, negative; NULL for non-soil elements),
date (date32), value (float32), qc_flag, qa_flag, orig_value, orig_qc_flag
(orig_* non-NULL means NRCS revised this reading; NULL means never revised).
Sorted (element, depth, station, date), zstd, 200k row groups. For any query,
read the pair: read_parquet(['daily/archive.parquet', 'daily/current.parquet']).
Every file has a fixed name and URL; there is nothing to list or glob.
One station, any window, full history (the archive/current pair reads as one table):
Current conditions, every station, one 48 KB read:
The whole network (network and state are ordinary columns):
The quality-control history: what did NRCS revise, and from what?
Soil moisture with the station map: the latest 2-inch reading at every Alabama SCAN station.
Percent of normal, the axis every SNOTEL plot uses:
Spatial join, stations near a point (the geometry column loads as a typed GEOMETRY('OGC:CRS84') in DuckDB spatial; geopandas.read_parquet works unchanged):
pyarrow prunes and pushes filters down over HTTP (a station query moves a few hundred KB, not the file):
Two stdlib traps to avoid: pd.read_parquet(url) and bare urllib fail with 403
(the CDN rejects the Python-urllib user agent on full-object requests; ranged
requests and fsspec/aiohttp are fine), and gpd.read_parquet(url) does not accept
https URLs directly (wrap with fsspec.open as above).
Fetched from the AWDB REST API v1 (wcc.sc.egov.usda.gov/awdbRestApi), full period of
record through 2026-09-01, crawled 2026-09-01/02 (all 1,219 stations, zero skips).
Upstream data is a US Government work (public domain); this compilation is released
under CC0. The first consumer was a Sentinel-2 melt-out climatology validated against
Atwater and Snowbird, whose predicted June melt-out matches both the daily record here
and the medianMeltout normal (June 14 at Snowbird).
Prior art, gratefully: egagli/snotel_ccss_stations (daily CSVs on GitHub) and scottyhq/snotel (the 2022 station-metadata groundwork).
hourly/ tree with the same archive/current shape will be added if there is demand.part-0000
style names, which exist for listing-based readers). Queries and notebooks can
hardcode paths and survive every refresh.qc_flag / qa_flag are NRCS's codes as served (V valid, E edited, S suspect,
C composite, K estimated, ...). SNDN and SNRR are derived products and carry no
revisions by construction.end_date of 2100-01-01 in the station table means "active".A daily job is planned; until it lands, treat this as a point-in-time snapshot dated in
the repo description. The refresh design: each day, refetch a trailing window (90 days),
merge last-write-wins, and rewrite daily/current.parquet and latest.parquet (a few
MB). Because NRCS revises past values during quality control (43% of all SWE rows have
been revised at least once), a quarterly full re-crawl rewrites daily/archive.parquet
to catch revisions older than the window. Files are replaced whole, never patched, and
never renamed. An hourly/ tree with the same archive/current pair may follow if there
is demand.