Keep columns consistent
Provider keys map to documented fields such as event_time_utc, temp_c, visibility_miles, and source.
Mostly Right maps provider keys, units, identifiers, and missing-value sentinels into documented fields. Functions and columns use descriptive names, and every row says which source produced it.
{
"station": "KNYC",
"event_time_utc": "2025-01-15T23:51:00Z",
"temp_c": -2.2,
"temp_f": 28.0,
"dewpoint_c": -13.9,
"visibility_miles": 10.0,
"source": "iem",
"raw_metar": "METAR KNYC ..."
} Provider-specific payloads are normalized before the row reaches your code. Source identity and missing measurements remain explicit.
Provider keys map to documented fields such as event_time_utc, temp_c, visibility_miles, and source.
Fields such as temp_c, wind_speed_ms, and precipitation_mm_1h state the unit used by each value.
Provider sentinels and omitted measurements become null, never zero, an empty string, or a guessed value.
Functions say what they return. Arguments repeat across related calls. Columns state the measurement and unit.
Adapters absorb supported provider differences and return the documented schema for that data domain.
Python and TypeScript use corresponding names such as weather.observations() and weather.forecasts().
Build analysis on documented columns, units, null behavior, and identifiers rather than provider payloads.
NoDataError and ContractError separate missing data from an invalid request without parsing error strings.