Team Ai
Datasetpublic

idle-intelligence/metar-stations

METAR Stations (Active, 7-Day Window) A worldwide list of METAR/ASOS weather stations, sourced from the Iowa Environmental Mesonet (IEM) ASOS/AWOS networks. stations.json keeps only stations that actually reported at least once in the trailing 7-day window; stations_all.json keeps the full roster, including stations that were silent over that window (some other station lists still carry these as open), with a flag for whether each one reported. Files and fields… See the full description on the dataset page: https://huggingface.co/datasets/idle-intelligence/metar-stations.

sourceHugging Facecc0-1.0updated 5d agoView on Hugging Face
0likes708downloads
Dataset Card

METAR Stations (Active, 7-Day Window)

A worldwide list of METAR/ASOS weather stations, sourced from the Iowa Environmental Mesonet (IEM) ASOS/AWOS networks. stations.json keeps only stations that actually reported at least once in the trailing 7-day window; stations_all.json keeps the full roster, including stations that were silent over that window (some other station lists still carry these as open), with a flag for whether each one reported.

Files and fields

stations.json, active stations only, compact rows for a browser client, one array per station:

fieldtypeunit
icaostringstation id as IEM uses it: the 4-letter ICAO code, or a 3-character FAA id for 2,444 stations, mostly in the US
latfloatdegrees, 4 decimals
lonfloatdegrees, 4 decimals
elev_mfloatmeters
namestringstation name
countrystringISO-2 country code

stations_all.json, every roster station whether active or silent, same row shape as stations.json plus two trailing fields:

fieldtypeunit
icaostringstation id, same convention as stations.json
latfloatdegrees, 4 decimals
lonfloatdegrees, 4 decimals
elev_mfloatmeters
namestringstation name
countrystringISO-2 country code
reportedbooltrue if the station had >=1 tmpf reading in the 7-day window
lastreportutcstring or nulllast confirmed report in the pulled window, or null if reported is false

stations.parquet, the same rows as stations.json plus two fields used to build the list, for the Hub's table viewer:

fieldtypeunit
icaostringstation id as IEM uses it: the 4-letter ICAO code, or a 3-character FAA id for 2,444 stations, mostly in the US
latfloatdegrees, 4 decimals
lonfloatdegrees, 4 decimals
elev_mfloatmeters
namestringstation name
countrystringISO-2 country code
lastreportutcstringISO 8601 timestamp, last confirmed report in the pulled window
source_networkstringIEM network id, e.g. FR__ASOS

How it was built

build_active_stations.py walks every IEM network whose id ends in ASOS (one network per country or per US state/Canadian province), pulls each network's station roster from IEM's geojson endpoint, then pulls each network's temperature (tmpf) archive over a 7-day window from IEM's asos.py endpoint. A station goes into stations.json only if it has at least one non-empty tmpf reading anywhere in that window; a station's presence in IEM's roster feed (online=true) is not treated as evidence of activity, since some roster entries stay marked online for years after they stop reporting. stations_all.json is built from a second pass over the same per-network geojson roster endpoint (kept for every station this time, not just the active ones) with the reported flag and last_report_utc taken from the already-fetched activity data, so the archive endpoint is never queried twice for the same network.

IEM lists a depth or a wrong negative elevation for 17 coastal and offshore stations (oil platforms, islands, lighthouses); the script sets these to 0 m. Stations that really are below sea level, around the Caspian Sea and in the Imperial Valley, keep their elevation.

Elevations are IEM's; 17 wrong negative values on active coastal and offshore stations are set to 0 m by the build, while silent stations keep IEM's values, a few of them wrong (helidecks, ships), which does not matter for estimates since only reporting stations are used.

Roster seen: 7,534 stations across 266 networks. Kept in stations.json (reported at least once in the 7-day window): 5,614. Silent in that window but present in stations_all.json: 1,920. Build date: 2026-09-28, window 2026-09-21 to 2026-09-28.

Source and license

Data pulled from the Iowa Environmental Mesonet (IEM), Iowa State University: https://mesonet.agron.iastate.edu/. IEM's data is public domain; attribution is appreciated (see https://mesonet.agron.iastate.edu/disclaimer.php). This dataset is released under CC0-1.0. IEM's own terms place no restriction on redistribution beyond that appreciated attribution, so CC0-1.0 is used here rather than a more restrictive license.

How to regenerate

venv/bin/python build_active_stations.py

The window is computed from the current date each run, so re-running later produces a different 7-day window and station set. Progress checkpoints in checkpoint_rows.jsonl/checkpoint_done_networks.txt (activity) and checkpoint_roster_all.jsonl/checkpoint_roster_done_networks.txt (full roster), so an interrupted run resumes per-network instead of re-fetching from scratch.

Using your own station list

The weather-web library reads any list in the same row format; see its README (github.com/idle-intelligence/weather-web).