← All Side Quests
Oct 7, 2026Visualization

A Year in the Air

See how air quality changed day by day in a U.S. metro area.

Try the project ↓
How to use this project

Help

How to explore

Outdoor monitors measure several common pollutants. The EPA turns those readings into a daily Air Quality Index so people can see when measured air quality raised more concern.

  1. Start with Indianapolis

    Open its highest July day, then choose any other date in the daily calendar.

  2. Compare the months

    Select a month to see how many reported days were Good, Moderate, or above an index of 100.

  3. Check the main pollutant

    See which measured pollutant produced the highest index on each day in the selected month.

  4. Put the area in context

    Compare its middle day and rough-day mark with 438 other well-covered areas.

Air Quality Index (AQI)
The EPA's daily scale for measured air quality; higher numbers mean greater concern.
Main pollutant
The measured pollutant with the highest index value in an area on that day.
Metro or micropolitan area
One or more counties connected to the same city or town by commuting patterns.
Middle reported day
The median: half of an area's reported days had a lower or equal index, and half had a higher or equal index.
Rough-day mark
The index that nine out of ten reported days were at or below; the highest tenth were above it.
Side Quest / VisualizationChoose one of 439 areas with at least 300 reported days, inspect any day in the 2025 calendar, select a month, compare the pollutant that set each daily index, and place the area's middle and rougher days beside the national distribution.
U.S. daily air quality · 2025

A year
in the air

See how air quality changed day by day in a U.S. metro area.

Outdoor monitors turn several pollutants into one daily Air Quality Index. The higher the number, the greater the concern in the EPA scale.

01 / Daily record

Choose an area, then pick a day

The colored and patterned tiles follow the EPA categories. Choose a date to see the index, the leading pollutant, and how many monitoring sites reported.

Selected day

Saturday, July 5

170Air Quality Index

Unhealthy

Main pollutant
Fine particles (PM2.5)
Sites reporting
12
EPA category range
AQI 151–200

The daily index is the highest available pollutant index reported across sites in this area. It does not describe every block or every hour.

July 202531 reported days

Pick a tile. The number is the day of the month.

GoodAQI 0–50ModerateAQI 51–100Unhealthy for sensitive groupsAQI 101–150UnhealthyAQI 151–200Very unhealthyAQI 201–300HazardousAQI 301 or higher

How to read this: A higher tile value means greater concern on the EPA scale. Color and pattern show the category; the day card names the pollutant that produced the highest index.

02 / Months

See how the year changed

Each row counts reported days by category. Choose a month to update its pollutant view and the daily calendar above.

03 / Main pollutant

What set the daily index?

EPA calculates an index for each measured pollutant. The highest one becomes the area’s daily index. These bars count which pollutant led in July.

Fine particles (PM2.5)21 days
Ozone10 days
Coarse particles (PM10)0 days
Nitrogen dioxide (NO₂)0 days
Carbon monoxide (CO)0 days
04 / U.S. comparison

Put the year beside other areas

Each dot is one of 439 areas with at least 300 reported days. Right means a higher middle day. Up means a higher rough-day mark.

180Rough-day mark0
0Middle reported day100 AQI
Highest rough-day marks

The rough-day mark is the index that nine out of ten reported days were at or below. The highest tenth were above it.

How to read this: The middle day describes a typical reported day. The rough-day mark focuses on the higher end without letting one extreme day control the comparison. Differences can reflect pollution, weather, geography, and what monitors measured; this project does not separate those causes.

The measured year

A daily index makes a pattern visible. It does not make the air uniform.

The 2025 file is complete under EPA’s reporting schedule. Every view uses a checked-in snapshot, so the experience makes no request to EPA after the page loads.

I found the EPA Air Quality System's pre-generated files through the allowlisted Data.gov catalog, opened the EPA download documentation and public-domain license, and retrieved the completed 2025 daily Air Quality Index file on October 7, 2026.

Why this exists

The question

How did daily air quality change through 2025 in a chosen U.S. metro or micropolitan area, which pollutant most often set the daily index, and how did the area's typical and rougher days compare with areas that had similar monitoring coverage?

What to try

Choose one of 439 areas with at least 300 reported days, inspect any day in the 2025 calendar, select a month, compare the pollutant that set each daily index, and place the area's middle and rougher days beside the national distribution.

Method and limits

About the data

I selected the U.S. Environmental Protection Agency's pre-generated Air Quality System files through the allowlisted Data.gov catalog. Data.gov identifies the publisher as the EPA Office of Air and Radiation and links the EPA Standard Open Data License. That license says EPA-produced data is public domain by default. I opened the underlying EPA AirData download page and its report definitions before using the file.

I retrieved `daily_aqi_by_cbsa_2025.zip` on October 7, 2026. EPA marked the file as updated June 25, 2026. The 893,830-byte archive has SHA-256 `0e26b7ee20c0792700d1a0cf47ba0a892ec24a7e78596f138692026cf290058d` and contains one 13,068,348-byte CSV with 170,306 daily records for 498 core-based statistical areas. I used 2025 instead of the incomplete 2026 file because EPA says current-year Air Quality Index summaries remain preliminary until May 1 of the following year.

The reproducible Python reducer verifies the archive hash, byte counts, member name, columns, row count, area count, category labels, and pollutant labels. It retains the 439 areas with at least 300 reported days, leaving 158,758 daily records. That coverage rule keeps very sparse years out of the national comparison. It does not make monitoring identical across areas. The reducer corrects two corrupted display glyphs in the source names for Cañon City and Española; their area codes and measurements do not change. Each retained day stores its index, EPA category, main pollutant, and number of reporting sites in a compact checked-in string. The reducer repeatedly produced the same 1,299,775-byte snapshot with SHA-256 `7760a0cb6681e3a65fffc9d88cfc89709f6f2f677d79627211f0873cdac9267e`. The page imports this snapshot and makes no runtime request.

The middle reported day is the median daily index. The rough-day mark uses the nearest-rank 90th percentile: the value at position ceiling(0.9 × reported days) after sorting. It describes the higher end of the year without letting one extreme day determine the comparison. Month counts use EPA's published categories without combining Good and Moderate days. The daily main pollutant is whichever measured pollutant produced the highest available index across reporting sites, following EPA's definition.

These are area-level monitoring records, not direct readings for every neighborhood, hour, or person. Areas monitor different pollutant mixes at different numbers of sites, and a core-based statistical area may cover several counties or states. The views do not measure individual exposure, explain why an index rose, establish health outcomes, or rank places by overall livability. Weather, wildfire smoke, emissions, terrain, and monitoring coverage may all affect a pattern; this project does not separate those causes.

Skills used

  • Data analysis
  • Data engineering
  • Statistical reasoning
  • Visualization
  • Information design
  • Interaction design
  • Visual design
  • Creative coding
  • Product thinking
  • Editorial storytelling
  • Accessibility
  • Performance

What the data shows

  1. Indianapolis-Carmel-Anderson reported all 365 days in 2025: 137 were Good, 220 were Moderate, six were Unhealthy for Sensitive Groups, and two were Unhealthy. Its middle day was AQI 54 and its rough-day mark was 74.
  2. Fine particles (PM2.5) set Indianapolis's daily index on 267 days, ozone on 96 days, and coarse particles (PM10) on two days. The two highest days were July 5 at AQI 170 and July 4 at AQI 154; fine particles set both.
  3. Across the 439 retained areas, the middle rough-day mark was AQI 61 and the full range was 17 to 161. Indianapolis's mark of 74 ranked 49th from highest to lowest under that measure.
  4. Riverside-San Bernardino-Ontario had the highest rough-day mark at AQI 161 and 136 days above 100. Los Angeles-Long Beach-Anaheim followed at 147 and 99 days. These descriptions do not adjust for monitor placement, pollutant coverage, population, or causes.