Observation schema
weather.observations() returns merged METAR/SPECI reports. The canonical schema.observation.merged.v1 record has 30 fields; the weather read also attaches local_standard_date, the local-standard-time day used by training and settlement joins.
Python DataFrames and TypeScript rows use snake_case. They are not yet byte-for-byte identical, so inspect the returned schema before sharing a frozen contract across runtimes.
Identity and time
Section titled “Identity and time”| Field | Type | Notes |
|---|---|---|
station | string | Canonical ICAO/ASOS id, for example KNYC |
event_time_utc | UTC timestamp string | When the report is valid |
observation_type | enum | METAR or SPECI |
source | string | Bare row source: awc, iem, or ghcnh |
local_standard_date | date | Derived local-standard-time day for this station |
The merged report key is (station, event_time_utc, observation_type). When sources overlap, the fixed merge priority selects one survivor and the row keeps the source that actually won.
Temperature
Section titled “Temperature”| Field | Unit | Nullable |
|---|---|---|
temp_c | °C | Yes |
temp_f | °F | Yes |
dewpoint_c | °C | Yes |
dewpoint_f | °F | Yes |
The SDK preserves the available precision. Integer settlement rounding belongs in the settlement recipe, not the stored observation.
| Field | Unit | Nullable |
|---|---|---|
wind_direction_degrees | degrees true | Yes |
wind_speed_kt | knots | Yes |
wind_gust_kt | knots | Yes |
Variable winds can have a null direction.
Pressure, visibility, and precipitation
Section titled “Pressure, visibility, and precipitation”| Field | Unit | Notes |
|---|---|---|
altimeter_inhg | inHg | Altimeter setting |
sea_level_pressure_hpa | hPa | Sea-level pressure |
visibility_miles | statute miles | Parsed report visibility |
precipitation_in_1h | inches | Accumulation in the preceding hour |
These measurements are nullable when the source report does not carry them.
Sky layers
Section titled “Sky layers”Up to four layers are preserved:
| Fields | Notes |
|---|---|
sky_cover_1 … sky_cover_4 | CLR, FEW, SCT, BKN, OVC, VV, or null |
sky_base_1_ft … sky_base_4_ft | Layer base in feet, nullable |
Layer 1 is the lowest reported significant layer.
Weather, peak wind, snow, and raw report
Section titled “Weather, peak wind, snow, and raw report”| Field | Notes |
|---|---|
weather_codes | Raw METAR weather-code string |
peak_wind_gust_kt | Peak gust in knots |
peak_wind_direction_degrees | Peak-wind direction |
peak_wind_time | Peak-wind timestamp |
snow_depth_inches | Snow depth |
qc_field | Upstream source quality marker |
raw_metar | Original METAR text when the source provides it |
AWC’s structured JSON can leave raw_metar null. Do not assume every provider exposes the original bulletin text.
Field count
Section titled “Field count”The 30 canonical merged-schema fields are:
- identity/source: 4
- temperature: 4
- wind: 3
- pressure/visibility/precipitation: 4
- sky cover and bases: 8
- weather/peak wind/snow/QC/raw text: 7
local_standard_date is the additional derived join column on weather.observations() output.
1.x to 2.0 name changes
Section titled “1.x to 2.0 name changes”Common stale names and their 2.0 replacements:
| 1.x or pre-contract name | 2.0 |
|---|---|
station_code | station |
observed_at | event_time_utc |
wind_dir_degrees | wind_direction_degrees |
sea_level_pressure_mb | sea_level_pressure_hpa |
precip_1hr_inches | precipitation_in_1h |
peak_wind_dir | peak_wind_direction_degrees |
Related
Section titled “Related”- Weather observations for query examples
- Sources & provenance for merge and source-pin behavior
- Daily windows for local-day bucketing
- Quality control for the optional
obs_qc_statusannotation