"Select, validate, and use Earth2Studio gridded, forecast,
Scanned 9/8/2026
Install to Claude Code
npx -y skills add VectorSpaceLab/AREX-Skill --skill data-sources --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Data Sources?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vectorspacelab-data-sources)More formats (shields.io, HTML) on the badges page.
---
name: data-sources
description: "Select, validate, and use Earth2Studio gridded, forecast,
observational, tabular, satellite, cloud-store, and local data sources without
confusing source contracts or variable lexicons."
disable-model-invocation: true
metadata:
disco-role: operating
license: Apache 2.0
---
# Earth2Studio data sources
Use this skill when a workflow must choose or call an Earth2Studio data source,
forecast source, tabular observation source, or local Xarray source. It teaches
source selection, request-shape validation, lexicon translation, time windows,
and safe offline checks. It does **not** run model inference, select a prognostic/
diagnostic model, or perform full remote downloads.
## Decide the source contract first
Choose the smallest contract that matches the data:
| Need | Interface | Call | Result |
|---|---|---|---|
| Gridded analysis/initial state | `DataSource` | `(time, variable)` | `xarray.DataArray` |
| Forecast product with explicit origin and lead | `ForecastSource` | `(time, lead_time, variable)` | `xarray.DataArray` |
| Sparse observations or metadata | `DataFrameSource` | `(time, variable, fields=None)` | `pandas.DataFrame` |
| Sparse forecast observations | `ForecastFrameSource` | `(time, lead_time, variable, fields=None)` | `pandas.DataFrame` |
A DataSource's array normally has `time`, `variable`, then spatial/product
coordinates. A ForecastSource adds `lead_time`; DataFrame sources expose
`SCHEMA`, and `fields` must be a subset. Do not pass a forecast source to an
API expecting a plain source, or vice versa.
For a source choice, record product family, time coverage/cadence, variable
vocabulary, grid, output type, cache policy, optional dependencies,
credentials, and network policy. The built-in catalogue is broad but not
exhaustive; availability, licenses, historical range, and variable support
vary. See [api-reference.md](references/api-reference.md) for representative
families and decision-level prerequisites.
## Request data with normalized coordinates
1. Use UTC request times. A single `datetime`, list, or NumPy datetime array is
accepted. Time normalization converts timezone-aware values to naive UTC;
naive values are treated as UTC.
2. Use Earth2Studio variable IDs, not a backend's native field spelling. Pass a
string or an ordered list/array of strings.
3. For a forecast source, pass a `timedelta`, list, or NumPy timedelta array as
`lead_time`; preserve the distinction between initialization `time` and
valid time `time + lead_time`.
4. Inspect the returned coordinates and shape before handing data onward:
requested time and variable IDs should be represented, and forecast output
must contain `lead_time`. Do not assume every source supports every ID,
cadence, level, or lead.
5. For observation/tabular sources, request only needed `fields` after checking
`source.SCHEMA`. A DataFrame can contain observation values, `time`,
`variable`, `lat`, `lon`, `elev`, station/type, quality, or product-specific
metadata; it is not an N-D grid.
The source's synchronous `__call__` is normal. If it supports `fetch`,
`await source.fetch(...)` has the same contract for an async caller or bounded
batch. Do not assume every source has an async implementation.
## Use the lexicon as the compatibility boundary
Earth2Studio IDs such as `t2m`, `u10m`, `v10m`, `msl`, `z500`, and `tcwv` are
standardized vocabulary entries, not promises that every source provides them.
Each source has a source-specific lexicon mapping an Earth2Studio ID to a
backend key, selector, or compound route. A lexicon may also attach a modifier
for unit, sign, decomposition, accumulation, or representation conversion.
Before a remote or local request:
- Verify every requested ID is in the selected source lexicon; a missing ID is
a source capability error, not a reason to guess a native backend name.
- Read the mapped route and modifier behavior when units or levels matter.
- Treat pressure suffixes (`z500`, `t850`) as pressure levels, `m` suffixes
(`u10m`) as height above surface, and `k`-style native levels as
source/use-case-specific. Do not interpolate or compare custom levels as if
they were interchangeable.
- Preserve source output variable coordinates as Earth2Studio IDs. If writing
a custom source, map native names internally and return standardized IDs.
The mapping patterns and a missing-variable synthetic example are in
[lexicon-reference.md](references/lexicon-reference.md).
## Choose among source families
Use these families for routing, not as an exhaustive model/data list:
- **Gridded reanalysis/cloud stores:** ARCO, WeatherBench2 (`WB2ERA5` variants),
NCAR/ERA5, CDS, CMIP6, and similar products. Check the `data` extra, date
range, cache, and grid/level support. Large requests may download or cache
substantial data.
- **Gridded analyses and forecasts:** GFS/GFS_FX, HRRR/HRRR_FX, IFS/IFS_FX,
GEFS, CFS, and dynamical/forecast variants. Use a ForecastSource only when
the source exposes explicit lead time; validate cycle/lead availability and
whether a variable exists only for positive leads.
- **Observation/tabular:** GHCN daily/hourly, ISD, IEM ASOS, GDAS conventional,
UFS/NNJA observation sources, and satellite sounder frames. Check the
PyArrow schema, station/product scope, and tolerance window. Product-specific
extras can include BUFR, GRIB, raster/STAC, or service clients.
- **Satellite, radar, and cloud imagery:** GOES/GOES GLM, Himawari, Meteosat,
JPSS/MetOp, MRMS, OPERA, and Planetary Computer adapters. These generally
need the `data` extra plus service-specific availability and may require
public-cloud access, STAC metadata, or credentials. Confirm the sensor
lexicon and spatial coordinates before requesting data.
- **Local/offline:** `DataArrayFile`, `DataSetFile`, `DataArrayDirectory`,
`DataArrayPathList`, `InferenceOutputSource`, `Constant`, `Constant_FX`,
`Random`, `Random_FX`, and `RandomDataFrame`. Prefer these for reproducible
smoke tests, air-gapped runs, and pre-staged datasets.
Remote constructors may be cheap while construction; the first call can open
stores, list objects, download bytes, decode products, and populate a cache.
Keep credentials, network policy, cache location, and data license explicit;
never put credentials in a lexicon, source constructor, command line, or skill.
## Adapt source data for downstream utilities
Use `fetch_data(source, time, variable, lead_time=..., device=..., interp_to=...,
interp_method=..., legacy=...)` to obtain inference-ready data. It detects a
`lead_time` parameter; a plain DataSource is called at `time + lead` and
assembled with a lead dimension. `legacy=True` returns `(torch.Tensor,
CoordSystem)`; `legacy=False` returns Xarray, rejects `interp_to`, and needs
CuPy for CUDA. Curvilinear interpolation requires `interp_method="linear"`.
Use `fetch_dataframe(source, time, variable, fields=..., lead_time=..., device=...)`
for tabular sources; it attaches request metadata in `df.attrs`, returns pandas
on CPU, and needs CuPy/cuDF on CUDA. `prep_data_array` converts an existing
DataArray to `(tensor, CoordSystem)`. Exact signatures are in
[api-reference.md](references/api-reference.md); formats are in
[data-formats.md](references/data-formats.md).
## Local/offline workflow
1. Build or obtain a local Xarray file/store with `time` and `variable`, plus
`lat`/`lon` or documented spatial coordinates when needed.
2. Use `DataArrayFile(path)` or `DataSetFile(path, array_name)`; use
`DataArrayDirectory` for the year/month convention and `DataArrayPathList`
for consistent multi-file collections (requiring `time`, `variable`,
`lat`, and `lon`).
3. For outputs with `time` and `lead_time`, use `InferenceOutputSource` after
filtering extras so one of those dimensions has length one.
4. Select one known time/variable and assert dimensions, labels, dtype, finite
values, and equality. Run the bundled `--help` and tiny-fixture check; it
never contacts a remote store.
Example shape (the exact spatial dimensions are source-dependent):
```python
from collections import OrderedDict
from datetime import datetime
import numpy as np
from earth2studio.data import Constant, Constant_FX, fetch_data
# A local deterministic fixture; no network or model package is needed.
source = Constant(OrderedDict([("lat", np.array([0.])), ("lon", np.array([0.]))]))
da = source(datetime(2024, 1, 1), ["t2m"])
forecast = Constant_FX(OrderedDict([("lat", np.array([0.])), ("lon", np.array([0.]))]))
x, coords = fetch_data(forecast, np.array([np.datetime64("2024-01-01")]),
np.array(["t2m"]),
lead_time=np.array([np.timedelta64(0, "h")]))
```
The snippet is intentionally a shape pattern, not an inference workflow. For
a fuller local file check, use [scripts/local_source_smoke.py](scripts/local_source_smoke.py).
## Time windows, tolerance, and recovery
A time tolerance is a selection policy, not a resampling instruction. Sources
that support it accept one `timedelta`/`np.timedelta64` for symmetric
`[-tol, +tol]`, or a `(lower, upper)` tuple for asymmetric bounds. Bounds must
satisfy `lower <= upper`; negative lower and positive upper are normal. The
observation row timestamp must be checked against the intended interval, and
empty results are not proof that a nearby record exists.
`TimeWindow` wraps a plain DataSource (not a ForecastSource) and fetches fixed
offsets, appending configured suffixes such as `_tm1`, `_t`, `_tp1`. It requires
non-empty equal-length `offsets`/`suffixes`; `group_by` controls output order.
Underlying missing-time and missing-variable behavior is preserved. See
[troubleshooting.md](references/troubleshooting.md) before widening a window or
changing a source.
Classify failures before retrying: missing lexicon ID, invalid schema/field,
unsupported time/lead, empty tolerance match, missing optional package,
credential/network failure, or malformed local dimensions. Fix the class-specific
cause; do not guess a backend name or silently widen time bounds.
## Limits and handoff
This sub-skill intentionally omits model inference, full remote acquisition,
credential setup, exhaustive source/model matrices, and backend-specific
network operations. It does not guarantee that a named family is installed or
that a public endpoint is reachable. For source construction, use the
repository's separate datasource-development workflow; for model execution,
route to the model/inference skill. Candidate native checks include the random,
constant, local-Xarray, TimeWindow, and lexicon tests; they are evidence for
validation planning, not a replacement for a request-specific source check.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!