nps-open-climate-data-v1.0.0-all.zip All four archives below in one download. Use this for offline analysis.
Canonical distribution is the versioned Zenodo
deposit (DOI 10.5281/zenodo.19823584).
Four download options below; pick the subset you need.
MIT-licensed.
nps-open-climate-data-v1.0.0-all.zip All four archives below in one download. Use this for offline analysis.
nps-open-climate-data-v1.0.0-daily.zip Raw 1980–2025 daily series per park in DAYMET / ERA5 native units (K, m, kg/m², W/m², Pa). Multipart parks ship one .csv.gz per polygon.
nps-open-climate-data-v1.0.0-summary.zip Per-park summary JSONs — annual + seasonal aggregates, Mann–Kendall / Theil–Sen trends, monthly decomposition, climate stripes — plus parks.json index. Temperatures in °C.
nps-open-climate-data-v1.0.0-boundaries.zip PAD-US 4.1 proclamation polygons dissolved per park, simplified to 50 m, in WGS84. Includes all_parks.geojson FeatureCollection.
nps-open-climate-data-v1.0.0/ folder:
unzip nps-open-climate-data-v1.0.0-summary.zip .gz extension)
or decompress first:
# in Python
import pandas as pd
df = pd.read_csv("daily/yellowstone/yellowstone.csv.gz")
# from the shell
gunzip daily/yellowstone/yellowstone.csv.gz import json
summary = json.load(open("summary/yellowstone.json"))
print(summary["headline_trends"]["tmean_c"]) import geopandas as gpd
gdf = gpd.read_file("boundaries/yellowstone.geojson")
The Python package ships a small Zenodo download helper.
It pulls the archive on first use, caches under
~/.cache/nps_climate_data/, and returns ready-
to-use objects:
# Pure-stdlib helper that pulls + caches the Zenodo archives, then
# returns a pandas DataFrame for any park's daily series:
import nps_climate_data as nps
df = nps.fetch_daily("yellowstone") # raw daily CSV → DataFrame
sj = nps.fetch_summary("yellowstone") # summary JSON → dict
arc = nps.fetch_archive("boundaries") # downloads + extracts the zip
# Caches under ~/.cache/nps_climate_data so subsequent calls are local.
Point an AI assistant at
/llms.txt
for a structured pointer to the dataset, download URLs,
Python helpers, schema, and limitations. The Python helper
(nps.fetch_daily(slug), etc.) is the simplest
path for an agent to actually fetch a park's series — it
handles the Zenodo download, gunzip, and parsing in one call.
The same information is also exposed as
schema.org/Dataset
JSON-LD on this page and the home page so structured-data
crawlers pick it up too.
The site also serves individual files at predictable URLs — handy for fetching one park without downloading the whole Zenodo archive.
/NPS-Open-Climate-Data/data/parks/<slug>.json Single park, served live. Same shape as the Zenodo summary archive.
/NPS-Open-Climate-Data/data/boundaries/<slug>.geojson PAD-US 4.1 polygon for one park, in WGS84.
/NPS-Open-Climate-Data/data/boundaries/all_parks.geojson All 63 parks in one FeatureCollection, with each park's headline warming slope exposed as feature properties.
These products are open-licensed under MIT and audited
internally against literature anchors and arithmetic / range
/ consistency checks (see
Methodology → QC
and docs/DATA_QC.md).
They are derived products — polygon-averaged
ERA5-Land and DAYMET fields aggregated over PAD-US 4.1
boundaries, not station observations.
pet_mm (ERA5-Land overestimate vs
FAO Penman–Monteith), high-elevation cold bias, and area-
naive multipart averaging.
Cite the methodology page, run your own QC for your use case, and treat the published numbers as a starting point.
The full auth → EE export → Drive pull → analysis → site build
flow lives in pipeline.ipynb. This is the condensed
terminal version.
git clone https://github.com/anniebritton/NPS-Open-Climate-Data
cd NPS-Open-Climate-Data
pip install -e .
# 1. Submit serverless EE export tasks (needs a GCP project with EE enabled).
# Runs on Google's servers; close the laptop after submit.
python -c "import ee; ee.Authenticate(auth_mode='localhost'); ee.Initialize(project='YOUR_PROJECT')"
python scripts/01_export_all_parks.py --start 1980-01-01
# 2. When the tasks show COMPLETED at code.earthengine.google.com/tasks,
# pull the CSVs from Drive (needs gcloud ADC with Drive scope).
python scripts/07_download_from_drive.py --drive-folder NPS_Climate_Data
# 3. Aggregate, run trend tests, write site JSON.
python scripts/02_build_site_data.py
# 4. Extract real PAD-US boundaries from a local v4.1 GDB (optional —
# committed boundaries are already in the repo).
python scripts/06_extract_padus_from_gdb.py
python scripts/05_generate_boundaries.py
# 5. Build and preview the static site locally.
cd site && npm install && npm run dev
Direct Python access via the nps_climate_data package
after pip install -e .. EE credentials must already be
initialised.
import ee, nps_climate_data as nps
ee.Initialize()
# One park, one date range:
df = nps.get_data("Glacier National Park", "2020-01-01", "2025-01-01")
# Full-history fetch with multipart handling (dict of sub-unit -> DataFrame):
per_unit = nps.get_park_data("saguaro") @dataset{britton2026nps,
author = {Britton, Annie and Pritchard, Ian},
title = {{NPS Open Climate Data v1.0.0: Pre-processed climate
trends for all 63 US National Parks}},
year = {2026},
publisher = {Zenodo},
version = {v1.0.0},
doi = {10.5281/zenodo.19823584},
url = {https://doi.org/10.5281/zenodo.19823584}
}