NOAA's Optimum Interpolation Sea Surface Temperature (OISST) v2.1 Climate Data Records, published as an Icechunk store for anonymous public access.
We parse each NOAA daily NetCDF's chunk references with VirtualiZarr and publish those (pancakes) virtually. Monthly statistics are computed data, chunked for timeseries (churro) access.
🌐 View data in browser · 💻 Data access (code) · 📦 Data access (NCEI) · 📦 Data access (AWS Open Data) · 📄 DOI 10.25921/RE9P-PT57
An Icechunk store of NOAA's 1/4° Daily Optimum Interpolation Sea Surface Temperature (OISST) v2.1 Climate Data Record — SST, SST anomaly, analysis error and sea-ice concentration on a global 0.25° grid, every day from 1981-09-01 to a day or two ago, kept up to date by an automated run about once a day.
The store is built and maintained by NERACOOS / GMRI, and was started at OceanHackWeek 2026; see How this was built. This page was written separately, by inspecting the published store, and says where it is reporting the maintainers' description rather than something checked.
The daily group is virtual: it copies no science data. Icechunk holds Zarr metadata
and byte-range references back to NOAA's original NetCDF files in the
NOAA Oceanic Climate Data Records bucket
on AWS (s3://noaa-cdr-sea-surface-temp-optimum-interpolation-pds, us-east-1), and every
read of a daily value goes to that bucket. That costs one extra step when opening — see
How to open it. The monthly group is ordinary Zarr data held in the
store itself.
No install, no account, no download — and no CORS workaround: both hosts a browser has to
talk to, Source Cooperative and NOAA's bucket, send Access-Control-Allow-Origin: *
(checked 2026-09-19).
The links open at 1 January 2025 (daily) and January 2025 (monthly) — a link cannot say "the
latest day" — and the time slider, the other variables and both groups are controls in the
viewer. Everything after # is a URL fragment, which the host never sees, so one viewer
build serves any store. Drag the globe and the address bar updates — copy it to share the
exact view you are looking at.
The viewer is gridlook, a WebGL globe for
cloud-hosted Zarr and Icechunk stores, published alongside the data at
noaa-oisst/viewer/.
Give it a moment on first load: the daily group's metadata takes several seconds to read
(see What to expect from reads). It is a browser reading a
remote archive, so treat it as a look, not an analysis.
No credentials and no account: both the store and NOAA's bucket are read anonymously.
pip install "icechunk>=2.0" xarray zarr "dask[array]" # Python >= 3.12
icechunk 1.x will not work.
icechunk.http_storagedoes not exist in icechunk 1.x (it arrived in 2.0). Every icechunk 2.x release needs Python 3.12 or newer, so on an older Pythonpip install icechunkquietly installs 1.1.x, and the code below fails withAttributeError: module 'icechunk' has no attribute 'http_storage'. Check what you have:python -c "import icechunk; print(icechunk.__version__)".
chunks={} gives lazy, dask-backed arrays. monthly needs no authorization of its own — it
is real data — but opening both from one authorized store is simplest.
Three things that trip people up:
sel(time="2024-07-04") or a slice; an exact midnight timestamp is not on the axis.
monthly is stamped at the first of each month.lon=290.5.zlev dimension (0 m). .squeeze() drops it.daily stores each day as one whole global field, which is what NOAA's files contain and
what a virtual store must keep. It is the right group for maps, single days and short
windows. A long time series at a point would read one whole field per day — 16,000 of them —
so for that use monthly, which is chunked (24 months, 1, 90, 90): the maintainers report
that 44 years at a point costs about 9 MB and 23 requests.
NOAA publishes a preliminary file within a day or two of observation and replaces it with
the final file about two weeks later. Both are in daily: the maintainers' description is
that a final file replaces the preliminary one in place as soon as it exists, so each date
always carries the best available data. A boolean preliminary coordinate marks which is
which; on 2026-09-19 the most recent 14 days were flagged.
monthly is computed from final data only, so it ends at the last complete final month.
Because NOAA deletes a preliminary file when the final one appears, a read of a
still-preliminary day can fail for the day or so before the store's next update; re-read, or
use final data only.
Measured on 2026-09-19 from a JupyterHub in AWS us-west-2 (the NOAA bucket is in us-east-1),
with zarr.config.set({"async.concurrency": 64}). Observations, not benchmarks.
Opening daily is slow because its time coordinate is stored as 16,452 one-value chunks,
one per appended day, and all of them are read on open. It is a fixed cost per open, not per
read.
OISST v2.1 ("Reynolds SST") is a NOAA Climate Data Record from the National Centers for Environmental Information. SST observations from satellite (AVHRR) and in situ platforms (ships, buoys, Argo floats) are interpolated and extrapolated to a complete, smoothed global field every day; at the marginal ice zone, sea-ice concentrations are used to generate proxy SSTs. This is the AVHRR-only product. The grid is 0.25° × 0.25°, 720 × 1440, global.
daily — stored as NOAA's int16 with scale_factor = 0.01 and _FillValue = -999 over
land; xarray decodes them to floating point with NaN:
monthly — sixteen variables, <var>_min, <var>_max, <var>_mean and <var>_std for
each of sst, anom, err and ice, as int16 with scale_factor = 0.01 for sst_* and
anom_* and 0.001 for err_* and ice_*. xarray decodes all of them correctly. Read
the names, not the attributes: each monthly variable still carries its daily source's
long_name — sst_std says "Daily sea surface temperature" — and the monthly group has
no global attributes. The valid_min/valid_max attributes of err_* and ice_* were not
rescaled with the data, so a tool that honours them (xarray does not) would mask monthly ice
concentrations above 0.1; ignore them. Reported to the maintainers as
noaa_oisst#2, along with the slow
open of daily. The daily group carries NOAA's full CF-1.6 / ACDD-1.3 global
attributes, taken from the most recent file.
Not in this repository. The store is built and updated by NERACOOS / GMRI; the project is
https://github.com/ocean-icechunks/noaa_oisst (formerly
oceanhackweek/ohw26_oisst_icechunk), whose README describes the design. As of 2026-09-19
that repository holds the README only — the pipeline code is not published there yet — so
what follows is the maintainers' description plus what the store itself shows.
daily: each NOAA NetCDF file's chunk references are parsed with
VirtualiZarr and committed. The references are
s3:// URLs into NOAA's bucket; the chunks are NOAA's own — one per day and variable,
zlib-compressed with shuffle.monthly: statistics computed from final daily data and written as Zarr, blosc-compressed.The store's history is its log — 1,089 commits on 2026-09-19, from "Repository initialized" on 2026-08-28 through the month-by-month backfill to entries like "Final files replace preliminary for 2026-09-01, 2026-09-02":
This README and the viewer are maintained in
https://github.com/ocean-icechunks/icechunks (noaa-oisst/README.md, and the noaa-oisst
entry in publish_viewer.py).
Nothing in NOAA's arrays or their attributes, as far as inspection shows. The store adds the
preliminary coordinate and the monthly group.
Every code block on this page was executed against the live store before it was published. Not verified: the monthly statistics against an independent calculation; the maintainers' figures for the cost of a point time series; how the update run is scheduled. The viewer's transport was checked here; that it draws was reported by Eli Holmes.
This page and the viewer configuration are released under Apache-2.0 and are free to use, copy, adapt and redistribute, commercially or not — no attribution required. For the store and its pipeline, see the maintainers' repository.
Data. The data is NOAA's, and the daily group contains none of it — only references to
NOAA's files. NOAA data disseminated through its open-data program are open to the public
and can be used as desired; NOAA requests attribution, and it is not permissible to state or
imply endorsement by or affiliation with NOAA. The monthly statistics are derived from
NOAA's data and are not an original, unaltered NOAA product. Cite the Climate Data Record,
not this repackaging:
Huang, Boyin; Liu, Chunying; Banzon, Viva F.; Freeman, Eric; Graham, Garrett; Hankins, William; Smith, Thomas M.; Zhang, Huai-Min (2020). NOAA 0.25-degree Daily Optimum Interpolation Sea Surface Temperature (OISST), Version 2.1. NOAA National Centers for Environmental Information. https://doi.org/10.25921/RE9P-PT57
Huang, B., C. Liu, V. Banzon, E. Freeman, G. Graham, B. Hankins, T. Smith, and H.-M. Zhang (2021). Improvements of the Daily Optimum Interpolation Sea Surface Temperature (DOISST) Version 2.1. Journal of Climate, 34(8), 2923–2939. https://doi.org/10.1175/JCLI-D-20-0166.1
Earlier descriptions of the method: Reynolds et al. (2007), https://doi.org/10.1175/2007JCLI1824.1, and Banzon et al. (2016), https://doi.org/10.5194/essd-8-165-2016.