US county daily air-quality disruption intelligence
Daily US county air-quality disruption intelligence, 2025-01-01 onward: one row per (date, county) from the EPA Air Quality System (AQS) daily AQI-by-county bulk files (keyless). Each row carries the day's AQI, EPA category, defining pollutant and site count, plus look-ahead-free derived features: unhealthy-episode detection (episode id, day number), consecutive-bad-day streak, a documented 0-100 disruption_score (AQI level + episode persistence), trailing 7/30-day bad-day counts and 7-day max, a 30-day AQI z-score, 90-day record-high flag, wildfire-season PM2.5 smoke flag, and the national AQI percentile. ~985 counties (50 states + DC). The daily-grain companion of us_county_aqi_annual (same source, county-year aggregates) — this is the event-level feed joinable by ISO date + county FIPS. Shops join disruption_score / episode flags to model foot-traffic and delivery disruption on smoke and ozone days; subscription businesses price regional acquisition against environmental churn pressure; sales teams weight territories by trailing bad-day exposure.
- Rows
- 399,198
- Columns
- 24
- Source cadence
- Monthly
- Last refreshed
- Oct 1, 2026
- Theme
- environment
| Column | Type | Description |
|---|---|---|
| date_iso | string | Calendar date of the observation (ISO YYYY-MM-DD); panel join key with county_fips. |
| county_fips | string | 5-digit county FIPS (state 2-digit + county 3-digit); panel join key with date_iso. |
| county_name | string | County name as published by EPA AQS. |
| state_code | string | USPS postal abbreviation. |
| state_name | string | State name as published by EPA AQS. |
| country_code | string | ISO alpha-3 country code (always USA). |
| aqi | integer | EPA Air Quality Index for the county-day (0-500; raw beyond-scale values capped at 500). (unit: AQI) |
| category | string | EPA AQI category (Good / Moderate / Unhealthy for Sensitive Groups / Unhealthy / Very Unhealthy / Hazardous). |
| defining_parameter | string | Pollutant driving the day's AQI (usually PM2.5 or Ozone). |
| n_sites_reporting | integer | Number of EPA monitor sites reporting in the county that day. (unit: sites) |
| bad_day | integer | 1 when AQI > 100 (any unhealthy band). (unit: flag) |
| episode_id | string | <county_fips>_<episode start YYYYMMDD> for a maximal run of consecutive calendar days with AQI > 100; empty string on non-bad days. |
| episode_day_n | integer | 1-based day number within the current unhealthy episode; 0 when today is not a bad day. (unit: days) |
| streak_bad | integer | Length of the consecutive-bad-day (AQI>100) run ending on this date; 0 when today is not bad. (unit: days) |
| disruption_score | float | 0-100 air-disruption score: round(0.65*clip((AQI-50)/2.5,0,100) + 0.35*clip(streak_bad,0,14)/14*100, 1). Higher = worse disruption today. (unit: score 0-100) |
| aqi_7d_max | float | Maximum AQI over the trailing 7 days including today. (unit: AQI) |
| n_bad_7d | integer | Days with AQI > 100 in the trailing 7 days including today. (unit: days) |
| n_bad_30d | integer | Days with AQI > 100 in the trailing 30 days including today. (unit: days) |
| aqi_z30 | float | Z-score of AQI vs its own trailing-30-day window (min 10 observations, population std; 0.0 when the window is flat; null before 10 observations). (unit: z-score) |
| record_high_90d | integer | 1 when AQI equals its trailing-90-day maximum. (unit: flag) |
| smoke_flag | integer | 1 when defining_parameter is PM2.5, AQI > 100, and the month is Jun/Jul/Aug (wildfire-season smoke window). (unit: flag) |
| aqi_pctile_national | float | Percentile rank (0-100, average method) of the day's AQI across all counties reporting that date. (unit: percentile) |
| snapshot_date | string | Date this snapshot was built (ISO). |
| row_hash | string | sha256('AQI_DAILY|<county_fips>|<YYYY-MM-DD>')[:16], unique row id and idempotency key. |
First 10 sample rows — a preview, not the complete dataset.
| date_iso | county_fips | county_name | state_code | state_name | country_code | aqi | category | defining_parameter | n_sites_reporting | bad_day | episode_id | episode_day_n | streak_bad | disruption_score | aqi_7d_max | n_bad_7d | n_bad_30d | aqi_z30 | record_high_90d | smoke_flag | aqi_pctile_national | snapshot_date | row_hash |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2025-01-01 | 01003 | Baldwin | AL | Alabama | USA | 20 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 20 | 0 | 0 | — | 1 | 0 | 22.2 | 2026-10-01 | 3998ff3cab926580 |
| 2025-01-01 | 01027 | Clay | AL | Alabama | USA | 11 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 11 | 0 | 0 | — | 1 | 0 | 8.7 | 2026-10-01 | eec4c768b6061ceb |
| 2025-01-01 | 01049 | DeKalb | AL | Alabama | USA | 29 | Good | Ozone | 2 | 0 | — | 0 | 0 | 0 | 29 | 0 | 0 | — | 1 | 0 | 46.7 | 2026-10-01 | 368efa249a180361 |
| 2025-01-01 | 01055 | Etowah | AL | Alabama | USA | 20 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 20 | 0 | 0 | — | 1 | 0 | 22.2 | 2026-10-01 | 0870a5138f9b3654 |
| 2025-01-01 | 01073 | Jefferson | AL | Alabama | USA | 31 | Good | Ozone | 5 | 0 | — | 0 | 0 | 0 | 31 | 0 | 0 | — | 1 | 0 | 56.7 | 2026-10-01 | 323d319cb6ad18ee |
| 2025-01-01 | 01079 | Lawrence | AL | Alabama | USA | 13 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 13 | 0 | 0 | — | 1 | 0 | 12.5 | 2026-10-01 | 44fe1bc47628767d |
| 2025-01-01 | 01089 | Madison | AL | Alabama | USA | 30 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 30 | 0 | 0 | — | 1 | 0 | 51 | 2026-10-01 | 8fddd6063b9958d9 |
| 2025-01-01 | 01097 | Mobile | AL | Alabama | USA | 11 | Good | PM2.5 | 2 | 0 | — | 0 | 0 | 0 | 11 | 0 | 0 | — | 1 | 0 | 8.7 | 2026-10-01 | b3f9a0e8182bd0eb |
| 2025-01-01 | 01101 | Montgomery | AL | Alabama | USA | 21 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 21 | 0 | 0 | — | 1 | 0 | 23.8 | 2026-10-01 | 6134788d97b567b0 |
| 2025-01-01 | 01103 | Morgan | AL | Alabama | USA | 19 | Good | PM2.5 | 1 | 0 | — | 0 | 0 | 0 | 19 | 0 | 0 | — | 1 | 0 | 20.5 | 2026-10-01 | db2cae89aac71608 |
Profiled Oct 1, 2026 from snapshot 20261001T060559Z-9209940046a8
Measured- Completeness
- 99.9%
- Rows
- 399,198
- Columns
- 24
- Columns with gaps
- 1
| Column | Missing | Distinct | Range | Distribution |
|---|---|---|---|---|
| date_isovarchar | 0% | 663 | — |
|
| county_fipsvarchar | 0% | 871 | — |
|
| county_namevarchar | 0% | 897 | — |
|
| state_codevarchar | 0% | 55 | — |
|
| state_namevarchar | 0% | 59 | — |
|
| country_codevarchar | 0% | 1 | — |
|
| aqibigint | 0% | 322 | 0 → 500median 40 | 7,864 outside 1st–99th percentile |
| categoryvarchar | 0% | 6 | — |
|
| defining_parametervarchar | 0% | 5 | — |
|
| n_sites_reportingbigint | 0% | 32 | 1 → 33median 1 | 3,652 outside 1st–99th percentile |
| bad_daybigint | 0% | 2 | 0 → 1median 0 | |
| episode_idvarchar | 0% | 2,216 | — |
|
| episode_day_nbigint | 0% | 22 | 0 → 20median 0 | |
| streak_badbigint | 0% | 22 | 0 → 20median 0 | |
| disruption_scoredouble | 0% | 374 | 0 → 80median 0 | 3,978 outside 1st–99th percentile |
| aqi_7d_maxdouble | 0% | 292 | 0 → 500median 54 | 7,520 outside 1st–99th percentile |
| n_bad_7dbigint | 0% | 9 | 0 → 7median 0 | 2,039 outside 1st–99th percentile |
| n_bad_30dbigint | 0% | 29 | 0 → 27median 0 | 3,156 outside 1st–99th percentile |
| aqi_z30double | 2.2% | 369,181 | -5.03 → 5.37median -0.0921 | 7,808 outside 1st–99th percentile |
| record_high_90dbigint | 0% | 2 | 0 → 1median 0 | |
| smoke_flagbigint | 0% | 2 | 0 → 1median 0 | |
| aqi_pctile_nationaldouble | 0% | 1,095 | 0.1 → 100median 50.1 | 7,537 outside 1st–99th percentile |
| snapshot_datevarchar | 0% | 1 | — |
|
| row_hashvarchar | 0% | 402,935 | — |
|
- Current
20261001T060559Z-9209940046a8 · sha256 9209940046a8…
399,198 rows · first snapshot
Point any LLM at the metadata endpoint — the documentation above is machine-readable too (JSON-LD + Croissant).
curl "https://datazimuts.com/v1/datasets/epa_daily_aqi_county_intel/us_county_aqi_daily" | jq '{title, rows, columns_count, license}'import requests
ds = requests.get("https://datazimuts.com/v1/datasets/epa_daily_aqi_county_intel/us_county_aqi_daily").json()
print(ds["title"], ds["rows"], "rows")
# Sample rows for an LLM context window
for row in ds.get("sample_rows", [])[:5]:
print(row)API endpoint: https://datazimuts.com/v1/datasets/epa_daily_aqi_county_intel/us_county_aqi_daily
Tip: fetch /llms.txt for the full machine-readable catalog.
Where this data comes from and what was made from it. Other people's work shows as counts; only shared projects are named.
Cite this snapshot
Pinned to snapshot 20261001T060559Z-9209940046a8 and its content hash, so readers get exactly the data you used.
US County Daily Air-Quality Disruption Intelligence (EPA AQS, keyless). (2026). US county daily air-quality disruption intelligence [Data set, snapshot 20261001T060559Z-9209940046a8, sha256 9209940046a8]. Datazimuts. Retrieved 2026-10-01, from https://datazimuts.com/en/datasets/epa_daily_aqi_county_intel/us_county_aqi_daily?snapshot=20261001T060559Z-9209940046a8
@misc{dz_epa_daily_aqi_county_intel_us_county_aqi_92099400,
title = {{US county daily air-quality disruption intelligence}},
author = {{US County Daily Air-Quality Disruption Intelligence (EPA AQS, keyless)}},
year = {2026},
publisher = {Datazimuts},
howpublished = {\url{https://datazimuts.com/en/datasets/epa_daily_aqi_county_intel/us_county_aqi_daily?snapshot=20261001T060559Z-9209940046a8}},
note = {Snapshot 20261001T060559Z-9209940046a8, sha256 9209940046a8dfd0a5bc6dc18843c2fb47de8c6bbd186c9c780caad1bd72de7e; accessed 2026-10-01}
}Embed a table or a chart
Paste this into any page. The embed is pinned to the same snapshot, follows the reader's light or dark setting, and always shows the source, license and a link back.
<iframe src="https://datazimuts.com/embed/chart?dataset=epa_daily_aqi_county_intel%2Fus_county_aqi_daily&lang=en&theme=auto&snapshot=20261001T060559Z-9209940046a8&x=date_iso&y=aqi&agg=avg" title="US county daily air-quality disruption intelligence" width="100%" height="380" style="border:0" loading="lazy"></iframe>
Ask about this dataset. Answers come only from its catalog record, measured profile and change history, and list the facts they used.