{"main_topic":"health","sub_topic":"epa","topic":"air_quality_days","key":"health/epa/air_quality_days","version":"1.0.0","year_min":2000,"year_max":2025,"year_gaps":[],"update_frequency":"annual","detail_levels":["counties"],"default_detail":"counties","path_template":"health/air_quality_days/year={year}/{detail}.parquet","grain":["year","county_fips","tract_geoid"],"title":"Air Quality Days (EPA AQI)","summary":"Days by Air Quality Index category in Georgia's monitored counties, and the share unhealthy for sensitive groups or worse.","description":"How many days each year the air in a Georgia county was good, moderate or unhealthy by the U.S. EPA's daily Air Quality Index (AQI), for every county with an AQI-reporting monitor (26 to 35 counties a year), 2000-2025. The headline is the share of monitored days with an AQI above 100 (unhealthy for sensitive groups or worse). Also served: the days in each of EPA's six AQI categories, the year's maximum, 90th-percentile and median daily AQI, and the days each pollutant (ozone, fine particles PM2.5, coarse particles PM10, nitrogen dioxide, carbon monoxide) set the day's AQI. A county's daily AQI is the highest AQI among its monitors and pollutants that day.","explorer":true,"search_aliases":{"en":["air pollution","smog","ozone","PM2.5","particulate matter","AQI","bad air days","unhealthy air","EPA air monitors","environmental health"],"es":["contaminación del aire","smog","ozono","partículas finas","aire contaminado","días de aire malo","calidad del aire","AQI","salud ambiental","monitores de la EPA"]},"source":"U.S. Environmental Protection Agency, Air Quality System, AirData pre-generated files: Annual Summary Data, AQI by County (annual_aqi_by_county_YYYY.zip, as of 2026-06-25)","source_url":"https://aqs.epa.gov/aqsweb/airdata/download_files.html","endpoint":"/api/v1/health/air_quality_days","columns":[{"name":"year","type":"integer","role":"year","nullable":false,"label":"Year","short_description":"","description":"Calendar year (January 1 - December 31) of the daily AQI values.","valid_values":null,"example":2025,"unit":null,"value_min":null,"value_max":null,"null_meaning":null,"key_metric_grain_contributor":false,"metric_component":null},{"name":"county_fips","type":"string","role":"fk_county","nullable":false,"label":"County FIPS","short_description":"","description":"5-digit county FIPS code, matched from EPA's county name through the counties dimension. Only counties with an AQI-reporting monitor that year have a row.","valid_values":null,"example":"13121","unit":null,"value_min":null,"value_max":null,"null_meaning":null,"key_metric_grain_contributor":false,"metric_component":null},{"name":"tract_geoid","type":"string","role":"fk_tract","nullable":true,"label":"Tract GEOID","short_description":"","description":"Always NULL: EPA's AQI summary is by county. Kept for the health domain's standard key shape.","valid_values":null,"example":null,"unit":null,"value_min":null,"value_max":null,"null_meaning":null,"key_metric_grain_contributor":false,"metric_component":null},{"name":"pct_days_unhealthy_for_sensitive_groups_or_above","type":"number","role":"metric","nullable":true,"label":"Share of Days Unhealthy for Sensitive Groups or Worse","short_description":"Share of the county's monitored days with an AQI above 100 (unhealthy for sensitive groups or worse).","description":"Share of the county's monitored days (num_days_with_aqi) whose daily AQI was above 100: unhealthy for sensitive groups (101-150), unhealthy (151-200), very unhealthy (201-300) or hazardous (301 and up). Our calculation, num_days_unhealthy_for_sensitive_groups_or_above / num_days_with_aqi, on the 0-1 scale (0.0137 = 1.37%). A share of the days the county had an AQI, not of the calendar year, so it is comparable where raw day counts are not; with few monitored days (as low as 11) it is noisy. For several counties or years, pool as SUM(num_days_unhealthy_for_sensitive_groups_or_above) / SUM(num_days_with_aqi).","valid_values":null,"example":0.0137,"unit":"proportion","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_unhealthy_for_sensitive_groups_or_above","type":"integer","role":"metric","nullable":true,"label":"Days Unhealthy for Sensitive Groups or Worse","short_description":"","description":"Days with a daily AQI above 100: our sum of the published unhealthy for sensitive groups, unhealthy, very unhealthy and hazardous day counts. The numerator of pct_days_unhealthy_for_sensitive_groups_or_above; a count of monitored days, so not comparable across counties or years on its own.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":"numerator"},{"name":"num_days_with_aqi","type":"integer","role":"metric","nullable":true,"label":"Days with an AQI","short_description":"","description":"Days in the year the county had a daily AQI value (11 to 366 in Georgia), as published (Days with AQI): the days monitored, not the calendar year. Below 365 when monitors run only in the March-October ozone season, sample every third or sixth day, or start or stop mid-year. The denominator of pct_days_unhealthy_for_sensitive_groups_or_above.","valid_values":null,"example":365,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":"denominator"},{"name":"num_days_good","type":"integer","role":"metric","nullable":true,"label":"Good Days","short_description":"","description":"Days in the year whose daily AQI was 0-50 (good), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_moderate","type":"integer","role":"metric","nullable":true,"label":"Moderate Days","short_description":"","description":"Days in the year whose daily AQI was 51-100 (moderate), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_unhealthy_for_sensitive_groups","type":"integer","role":"metric","nullable":true,"label":"Days Unhealthy for Sensitive Groups","short_description":"","description":"Days in the year whose daily AQI was 101-150 (unhealthy for sensitive groups), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_unhealthy","type":"integer","role":"metric","nullable":true,"label":"Unhealthy Days","short_description":"","description":"Days in the year whose daily AQI was 151-200 (unhealthy), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_very_unhealthy","type":"integer","role":"metric","nullable":true,"label":"Very Unhealthy Days","short_description":"","description":"Days in the year whose daily AQI was 201-300 (very unhealthy), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_hazardous","type":"integer","role":"metric","nullable":true,"label":"Hazardous Days","short_description":"","description":"Days in the year whose daily AQI was 301 or higher (hazardous), as published. One of six category counts that sum to num_days_with_aqi; a count of monitored days, so compare shares of num_days_with_aqi across counties and years, not raw counts.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"max_aqi","type":"number","role":"metric","nullable":true,"label":"Maximum AQI","short_description":"","description":"Highest of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. Georgia's highest is 357 (Richmond County, 2017), the series' only hazardous day, preserved as published. A statistic of one county's year: never sum or average it across counties or years.","valid_values":null,"example":154.0,"unit":"score","value_min":0,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"aqi_90th_percentile","type":"number","role":"metric","nullable":true,"label":"90th Percentile AQI","short_description":"","description":"90th percentile of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. A statistic of one county's year: never sum or average it across counties or years.","valid_values":null,"example":64.0,"unit":"score","value_min":0,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"median_aqi","type":"number","role":"metric","nullable":true,"label":"Median AQI","short_description":"","description":"Median of the county's daily AQI values over its monitored days, in AQI index points as published (whole numbers). The AQI runs 0-500 for reporting, but EPA publishes higher values as measured (above 500 elsewhere in the U.S.), so there is no upper bound. A statistic of one county's year: never sum or average it across counties or years.","valid_values":null,"example":45.0,"unit":"score","value_min":0,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_main_pollutant_co","type":"integer","role":"metric","nullable":true,"label":"Days Carbon Monoxide Was Main Pollutant","short_description":"","description":"Days carbon monoxide (CO) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_main_pollutant_no2","type":"integer","role":"metric","nullable":true,"label":"Days Nitrogen Dioxide Was Main Pollutant","short_description":"","description":"Days nitrogen dioxide (NO2) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_main_pollutant_ozone","type":"integer","role":"metric","nullable":true,"label":"Days Ozone Was Main Pollutant","short_description":"","description":"Days ground-level ozone was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_main_pollutant_pm25","type":"integer","role":"metric","nullable":true,"label":"Days PM2.5 Was Main Pollutant","short_description":"","description":"Days fine particulate matter (PM2.5) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null},{"name":"num_days_main_pollutant_pm10","type":"integer","role":"metric","nullable":true,"label":"Days PM10 Was Main Pollutant","short_description":"","description":"Days coarse particulate matter (PM10) was the main pollutant (the one whose AQI set the county's daily AQI), as published. The five main-pollutant counts sum to num_days_with_aqi; a second split of the same days as the AQI categories, so never add one to a category count. A 0 can mean the pollutant was measured but never the highest, or not measured in the county.","valid_values":null,"example":null,"unit":"count","value_min":null,"value_max":null,"null_meaning":"Never NULL: EPA publishes every column for every monitored county, with no suppression. A county with no monitor has no row at all.","key_metric_grain_contributor":false,"metric_component":null}],"key_metric":"pct_days_unhealthy_for_sensitive_groups_or_above","numeric_filter_columns":["pct_days_unhealthy_for_sensitive_groups_or_above","num_days_unhealthy_for_sensitive_groups_or_above","num_days_with_aqi","num_days_good","num_days_moderate","num_days_unhealthy_for_sensitive_groups","num_days_unhealthy","num_days_very_unhealthy","num_days_hazardous","max_aqi","aqi_90th_percentile","median_aqi","num_days_main_pollutant_co","num_days_main_pollutant_no2","num_days_main_pollutant_ozone","num_days_main_pollutant_pm25","num_days_main_pollutant_pm10"],"usage":"Star-schema fact table at county grain, monitored counties only. Join the counties dimension on county_fips; tract_geoid is always NULL. For several counties or years, pool the key metric as SUM(num_days_unhealthy_for_sensitive_groups_or_above) / SUM(num_days_with_aqi), a share of monitored county-days, never an average of county shares. Day counts add across counties only as county-days, never as days of the year. The six category counts split num_days_with_aqi and the five main-pollutant counts split it again, so never add a category count to a pollutant count. Max, 90th-percentile and median AQI never add or average across counties or years. Read directly with DuckDB over Parquet.","limitations":"Monitored counties only: a county has a row only in years it had an air monitor reporting a daily Air Quality Index (26 to 35 of Georgia's 159 counties a year, 36 over 2000-2025). No row is not clean air; it means no measurement. Shares are of the days the county had an AQI (num_days_with_aqi, 11 to 366), not of the calendar year: ozone-only monitors mostly run in the March-October ozone season, when most unhealthy days occur, and particle samplers may run every third or sixth day, so raw day counts are not comparable across counties or years and even shares are not strictly so. A county's daily AQI is the highest AQI among its monitors and pollutants that day, so it depends on which monitors the county had; monitors open and close (counties join in 2002 and 2005 and drop out in 2003, 2009, 2017-2018 and 2025), so a sum or pooled share across counties covers a changing set and there is no statewide row. EPA computes every year with the current AQI breakpoints (ozone revised 2015, fine particles 2024), so years are on one scale, but counts can differ from AQI reports published at the time. EPA regenerates the whole series in place; these files are as of 2026-06-25. The share of days unhealthy for sensitive groups or above and its day count are our calculation from EPA's published category counts. Unhealthy days come in episodes of consecutive days that often reach several counties at once, so they are not independent events: a test that treats each day separately overstates its certainty. EPA suppresses nothing: there are no NULLs, and a 0 is a real count of monitored days. tract_geoid is always NULL.","null_semantics":{"suppressed_to_null":false,"zero_is_real":true},"available_years":[2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025],"schema_hash":"a9ef0d9b29841d3d7561e0631a582c68b6cd0a71d53f5461a31879182619c177","tags":["health","u.s. environmental protection agency, air quality system, airdata pre-generated files: annual summary data, aqi by county","air_quality_days"],"granularity_description":"One row per year, county_fips, tract_geoid.","example_queries":[{"description":"Latest year (2025), counties detail","query":"SELECT * FROM air_quality_days WHERE year = 2025 LIMIT 100"}],"foreign_keys":[{"column":"county_fips","target_object":"counties","target_columns":["county_fips"],"attribute_columns_added":["county_name"],"scope":"global"},{"column":"tract_geoid","target_object":"tracts","target_columns":["tract_geoid"],"attribute_columns_added":["tract_name"],"scope":"global"}],"filters":[{"param":"year","kind":"year_exact","type":"integer","multi_value":false,"enum_enforced":false,"values":null},{"param":"year_min","kind":"year_range","type":"integer","multi_value":false,"enum_enforced":false,"values":null},{"param":"year_max","kind":"year_range","type":"integer","multi_value":false,"enum_enforced":false,"values":null},{"param":"detail","kind":"detail","type":"string","multi_value":false,"enum_enforced":true,"values":["counties"],"default":"counties"},{"param":"county_fips","kind":"foreign_key","column":"county_fips","type":"string","multi_value":true,"enum_enforced":false,"values":null},{"param":"tract_geoid","kind":"foreign_key","column":"tract_geoid","type":"string","multi_value":true,"enum_enforced":false,"values":null}],"filter_hints":[],"non_additive":[],"partitions":[],"value_implications":[],"year_meaning":null,"pooled_rates":[],"series_breaks":[],"year_window":null,"pooled_min_count":null,"values_endpoint":"/api/v1/health/air_quality_days/values"}