信息速览
AQS 是"Air Quality System"的缩写,是美国环保署的环境空气监测总库。它不是一个供人浏览的分析产品,而是一台记录仪:全国数千个监测点、上万个监测仪,每一次采样都要在这里落一行。公众在空气质量网站上看到的每一个数字,几乎都能回溯到这里的某一行。
它与大多数健康数据集的差别在于,它记录的对象不是人,而是空气。行的身份不是患者编号,而是"哪个站点、哪台仪器、哪个参数、哪一刻"。这个差别决定了它的全部使用方式,也决定了它最常见的误用。下面先给规模、时间与结构的骨架,再展开三个层:定位层回答"这条测量属于谁",测量层回答"这个数可不可信",取数层回答"怎么把它搬到自己的表里"。一屏速览见下表。
| 项 | 内容 |
|---|---|
| 全称 | Air Quality System(AQS) |
| 维护方 | 美国环保署 空气质量规划与标准办公室(OAQPS) |
| 性质 | 环境空气监测的原始测量库(非聚合产品、非实时) |
| 起始年份 | 最早样本 1957 年;全国可比口径自 1980 年起 |
| 累计测量 | 逾 30 亿条样本测量(官方 Primer) |
| 站点 / 监测仪 | 站列表 20,994 行;监测仪列表 370,090 行 |
| 参数 | 任一年度出现的参数少于 700 个;全时跨年度累计逾千个 |
| 时间粒度 | 样本时长 5 分钟至 24 小时;保证可得的离散间隔为"日" |
| 文件发布节奏 | 每年两次(约 5/6 月、11/12 月) |
| 主要入口 | 预生成文件、AQS API v2、AirData 门户 |
| 许可证 | 美国政府作品,无版权(公共领域) |
| 关联资源 | AirData(门户)、AirNow(实时)、毒物档案(HAP 增值版) |
§1 它到底是什么
一句话:AQS 是美国环境空气监测数据的权威原始层,所有下游产品——年度报告、趋势图、合规判定、流行病学的暴露变量——都是它的再加工。它的不可替代性不在体量,而在"唯一性":同一份监测记录,美国境内没有第二个平行系统在同等行政层级上把它收齐。
1.1 为什么它不能当成"数据集"来读
多数科研数据集有一个发布时刻、一个版本号、一份固定的样本量。AQS 三者都没有。它是一台持续运行的登记系统,行在增加、旧行在被修改、没有任何冻结版本。官方 Primer 在时效性一节写得很直白:没有版本化,也没有冻结,若他人需要按你取数时的原样复核或续做分析,使用者必须自己留存副本。
这句话的后果比听起来严重。同一份"2020 年某县 PM2.5 年均值",今天取和半年前取可能不同,因为提交机构在五年后仍可能因审计或复核而修改历史数据。做纵向研究时,把取数日期写进方法学,不是形式主义,而是复现的必要条件。
1.2 三十秒决策卡
左列写的是使用者的处境,右列是 AQS 能给的东西。
| 你的处境 | AQS 能提供什么 |
|---|---|
| 手上有某县的健康调查,想加一个"当地空气"协变量 | 该县监测站的逐日或年度浓度,可按县-年对齐 |
| 研究长期空气污染趋势与政策效应 | 站点级连续时间序列,最早可回溯到 1957 年,可比口径 1980 年起 |
| 需要训练或评估空气质量预测模型 | 带方法码、检出限、质控限定符的原始测量,可做真值 |
| 想复算某个标准是否达标 | 年度汇总中已按污染物标准分组的记录,可直接比对 |
| 要给公众做一个"今天空气如何"的页面 | 给不了,这类需求属于 AirNow |
| 只想要一张全国浓度分布图 | 给不了,AQS 不做空间插值 |
| 想要暴露组学的个人暴露 | 给不了,站点浓度不等于个人吸入量 |
1.3 三条判断,三十秒内做完
面对一份"美国的空气数据",可以先做三个判断,任一为否,就不该继续在这条路上找。
第一,你的问题是不是关于过去? 若是过去某年的年均值、某月的日序列、某次事件的峰值,这里的路是通的;若是"现在",路不通。
第二,你的分析单元是地区还是个人? 地区(县、都市区、站点周边缓冲区)可以;个人剂量不行。
第三,你需要的参数是不是标准污染物? 六项标准污染物(臭氧、颗粒物、一氧化碳、二氧化硫、二氧化氮、铅)覆盖最完整、质控最严、方法最齐;毒物要看官方是否建议改道毒物档案;气象参数可用但不在多数门户工具里。
三问全过,再看具体取数方式;有一个不过,先换路,不要指望在清洗阶段补救。
1.4 不适合谁
先把边界划清,后面才好谈用法。
如果你的需求是实时或当日空气质量,AQS 给不了你任何近期数据。官方文档明确写出:从采样到进入 AQS 可能需要六个月或更久。实时数据在 AirNow 系统里,两个系统不共用同一条通道,评估口径也不同。
如果你的需求是"每个县都有值",AQS 也给不了。没有监测站的县就没有数据,官方明确声明不提供空间插值。全国三千余个县里,常年有站点的只是其中一部分,农村县的覆盖率显著低于都市县,这一点在做全国性分析时是系统性偏倚而非随机缺失。
如果你的需求是个人暴露剂量,AQS 的站点浓度只是环境背景的一阶近似。人在室内的时间、通勤路径、呼吸速率都不在库里。用于流行病学的时间序列或队列设计是合适的,用于个体剂量反应推断则会把群体层面的关联错误地个体化。
§2 数据构成与规格
2.1 站、监测仪、监测点:三个常被混用的层级
AQS 里最容易被混淆的不是字段,而是"一个监测单元"的定义。官方 Primer 用两段话把它掰开,值得原样理解。
For the purposes of AQS, a monitor does not refer to a sampler or other specific piece of equipment. Instead, it reflects that a given parameter is being measured at a given site.
也就是说,监测仪(monitor)指的不是那台仪器,而是"某个站点上正在测某个参数"这件事。同一台采样器采回一个罐子,实验室从中测出 42 种物质,AQS 记为 42 个监测仪。这个约定是数据管理策略,代价是"仪器数"与"物理设备数"对不上。
由此得到三个层级:
| 层级 | 定义 | 唯一标识 | 官方行数 |
|---|---|---|---|
| 站点 site | 一个地理位置,可能运行多个参数 | 州码 + 县码 + 站号 | 20,994 |
| 监测仪 monitor | 站点 × 参数 | 站点键 + 参数码 + POC | 370,090 |
| 样本 sample measurement | 监测仪 × 一个采样时段的一个值 | 监测仪键 + 日期 + 时刻 | 逾 30 亿 |
POC 即 Parameter Occurrence Code,同一站点同一参数由多台设备并行测量时的区分序号。它回答的问题是"这个数来自第几台"。并址测量(collocated)就靠它区分,合并规则另见 §4.3。
读表要点:站点数两万出头,监测仪数三十七万,两者相差一个数量级以上。所谓"4,000+ 监测站"之类的说法,量级上与这两个口径都不吻合;官方页面上唯一给出的站点总量就是两万这一档,而任一年度实际运行的站点数远小于累积登记数。
2.2 时间跨度:为什么 1980 是个分水岭
最早的样本是 1957 年的。但"有数据"不等于"能用",AQS 自己划了两条线。
1980 年对应臭氧监测规程的一次修订(44 FR 8202),引入了修订后的监测仪校准程序。官方表述是:1980 年之前的年份也有数据,但这些数据的总不确定度与空间变异作为测量产物的程度高于之后年份;1980 年标志着全国一致的操作与质量保证程序的起点。
1999 年对应 PM2.5 及其组分监测的强制实施(62 FR 38652)。PM10 与 TSP 更早就有,但 1999 年才是全国性 FRM 与非 FRM PM2.5 监测的第一年,监测仪数量在这一年出现明显跃升。
这条线的实际含义是:做 1980 年以后的全国对比,可以把不同年代放在同一张图上;跨到 1980 年以前,就必须逐参数判断可比性,而 AQS 不提供这种判断,它只提供数据本身和一段免责说明。
| 时段 | 可用性 | 使用建议 |
|---|---|---|
| 1957–1979 | 有数据,参数有限,不确定度与空间变异较高 | 仅用于个案回溯,不用于跨年代合并 |
| 1980–1998 | 全国一致的操作与质控程序 | 可做长期趋势,注意参数集变化 |
| 1999 至今 | 增加全国性 PM2.5 与组分监测 | 主流分析区间 |
2.3 参数:数目本身就是一个陷阱
官方 Primer 给出的两个数字需要并排看:任一年度出现的不同参数少于 700 个,而全部年份累计出现过的不同参数是 1,177 个。API 的 list/parametersByClass 服务在全量类目下返回 1,380 条记录(2026-10-28 核对),这是一个更宽的口径——包含已停用或仅有元数据登记的参数。
三个数字各不相同,都不是错。第一个是"某一年实际在测的",第二个是"历史上出现过的",第三个是"系统里登记过的"。做参数清单时若混用,会得出互相矛盾的数量结论。
参数码是 AQS 自有的五位数字,不使用 CAS 号或其他通用命名规范。官方对此的提醒有两层:
第一,同一物质可能有多个参数码,最典型的是 PM2.5,它是方法相关的参数,按测量方法类型以不同参数码存储。
第二,同一物质可能在不同粒径分级下重复出现。官方举例:铝在四种不同粒径分级下被上报,在 AQS 里就是四个参数。
常用的几个码如下,全部经 API 参数表核对:
| 参数码 | 名称 | 类目 |
|---|---|---|
| 44201 | Ozone | 标准污染物 |
| 42401 | Sulfur dioxide | 标准污染物 |
| 42101 | Carbon monoxide | 标准污染物 |
| 42602 | Nitrogen dioxide | 标准污染物 |
| 88101 | PM2.5 - Local Conditions | 颗粒物(FRM/FEM) |
| 88502 | Acceptable PM2.5 AQI & Speciation Mass | 颗粒物(非 FRM) |
| 81102 | PM10 Total 0-10um STP | 颗粒物 |
| 86101 | PM10-2.5 - Local Conditions | 颗粒物(粗颗粒) |
| 45201 | Benzene | 挥发性有机物 |
注意 88101 与 88502 的分野。前者是联邦参考法或等效法测得的 PM2.5,用于合规判定;后者是连续监测仪报出的、可接受用于 AQI 的 PM2.5 质量。两者常并存于同一站点,数值接近但不相等,把二者直接相加会把同一片空气算两遍。
2.4 一次采样在文件中的形态
逐小时文件是最能说明结构的形态。它是全国范围、按参数或参数组、按年打包的 CSV,解压后每行一条测量。下面的样例取自官方字段说明,列名与顺序完全一致。
#-- hourly_44201_2024.csv 的表头与一行示意(列序同官方 FileFormats 文档)
State Code,County Code,Site Num,Parameter Code,POC,Latitude,Longitude,Datum,
Parameter Name,Date Local,Time Local,Date GMT,Time GMT,Sample Measurement,
Units of Measure,MDL,Uncertainty,Qualifier,Method Type,Method Code,
Method Name,State Name,County Name,Date of Last Change
37,183,0014,44201,2,35.900,−78.700,WGS84,Ozone,2024-06-18,14:00,
2024-06-18,18:00,0.052,Parts per million,0.005,,,FEM,047,
Ultraviolet Photometry - FEM,North Carolina,Wake,2024-11-08
逐字段读下来,会发现三个信息密度最高的位置。第 10 至 13 列是双时区时间戳:本地标准时与格林尼治时并列,本地时间不做夏令时调整,AQS 全部采样时刻都按当地标准时排布。第 18 列 Qualifier 记录该值是否被标记为空数据、异常事件或质控事件。第 20 至 21 列是方法类型与方法码,方法类型决定这个值能否进入合规判定,方法码则把数值绑定到具体的测量原理。
2.5 文件族:七类文件与它们的体积量级
官方文件页把预生成文件分成七类:站点与监测仪描述、年度汇总、日与日汇总、日 AQI、逐小时、8 小时平均、空白样品。七类的分工不是按数据量,而是按问题类型。
| 文件族 | 回答什么问题 | 典型体积(2024 年) |
|---|---|---|
| 站点 / 监测仪描述 | 这个站在哪、谁在管、测什么 | 两个文件合计不足 8 MB |
| 年度汇总 | 这一年的浓度与达标情况如何 | 全参数单文件,约 4 MB |
| 日汇总 | 哪一天发生了什么 | 单参数约 1 MB 至 6 MB |
| 日 AQI | 这一天的空气质量指数如何 | 县级全参数约 1.6 MB |
| 逐小时 | 这一小时的浓度是多少 | 单参数约 10 MB 至 70 MB |
| 8 小时平均 | 八小时滑动平均是否超标 | 单参数约 10 MB 至 55 MB |
| 空白样品 | 采样介质是否被污染 | 全年单文件约 2 MB |
体积差距来自行数。以臭氧为例,2024 年逐小时文件约九百万行、六十五兆;同年年度汇总覆盖全部参数也只有六万九千行。两者相差两个数量级,这解释了一个常见困惑:为什么"想看看这一年全国情况"不需要下载那几个大文件。
另需注意,逐小时文件只含 1 小时时长的样本。官方在文件格式文档里写明:5 分钟的二氧化硫、3 小时的毒物、24 小时的颗粒物组分都不在逐小时文件里,它们的汇总在日文件里,原始样本需另行申请。若研究问题需要 5 分钟级的二氧化硫峰值,逐小时文件满足不了。
2.6 坐标、基准面与空间连接
站点描述文件里有经纬度与基准面两列。基准面不统一是一个容易被忽略的细节:同一批站点的基准面可能是 WGS84,也可能是 NAD83,两者的差异在米级,做缓冲区分析时通常无所谓,做路段级或建筑级匹配时就不能忽略。
官方在数据字典里对坐标的说明还有一条:站点位置是监测探头的所在位置,可能是屋顶、地面或路边,海拔字段记录的是地面高程。这意味着站点坐标对应的是"空气被采集的那个点",不是"这一片区的中心"。
把站点接到人口栅格或道路网络上时,常用做法是画缓冲区取加权平均人口。缓冲区半径的选择没有官方依据,文献里从一公里到十公里都有。半径越大,站点代表性越强但空间分辨率越低;对小尺度研究,这是必须先写进方法学的决定。
2.7 与同类资源的定位差异
| 资源 | 内容 | 时间特征 | 差异 |
|---|---|---|---|
| AQS | 站点级原始与汇总测量,全参数 | 滞后半年以上 | 唯一权威原始层,含质控元数据 |
| AirData | 预生成文件与查询报表、交互图表 | 同 AQS,年两次 | 面向公众的出口,多数工具只给标准污染物 |
| AirNow | 实时与当日 AQI、预报 | 小时级 | 独立系统,数据不进 AQS,口径不同 |
| 毒物档案 | HAP 增值产品 | 滞后更长 | 额外质控与减缩,含 AQS 之外来源 |
| 各州机构系统 | 本州原始与运行数据 | 可能更早 | 覆盖本州,格式各异,AQS 为其汇总 |
这张表的读法是:AQS 在左,下游在右。倒过来找数据——先看 AirNow 再回溯 AQS——通常行不通,因为两个系统的记录不对应。
§3 定位层:一条测量到底属于谁
这一层解决的是"行身份"问题。任何把 AQS 与其他数据连接的工作,成败都在这里。
3.1 站点键的构成与它的脆弱之处
站点键是三段拼接:州 FIPS 码、县 FIPS 码、县内站号。前两段是标准联邦信息处理码,第三段是县内自编号,通常四位、保留前导零。完整的监测仪标识再往后接参数码与 POC,形如 SS-CCC-NNNN-PPPPP-Q。官方给出的例子是 01-089-0014-44201-2,即阿拉巴马州麦迪逊县第 14 号站点的臭氧监测仪,POC 为 2。
脆弱之处有三:
其一,站号是县内编号,不是全国编号。 跨州比对时必须带县码,只写站号会撞号。
其二,站点会迁移但键不变。 官方在站点描述文件里写明,站点信息一旦由所属机构录入,可能不会随实际情况更新,例如土地利用类型从城市变为郊区。这意味着站点属性字段反映的是录入时的状态。
其三,站点会关闭再重开。 站点描述文件含"站点建立日期"与"站点关闭日期"两列,做时间序列时要先用它们筛掉已关闭站点在关闭后的空档。
3.2 与县-年对齐:最常用的连接方式
流行病学里最常见的用法是把 AQS 当作暴露侧,按县与年对齐健康侧。这条路在国内外的环境流行病学研究中反复出现,步骤固定:
第一步,从站点描述文件取州码、县码、经纬度。第二步,从年度汇总文件取该站的年度统计量与有效天数。第三步,按县聚合站点。第四步,按县-年键与健康数据连接。
第三步是全部争议所在。一个县可能零个站、一个站或几十个站。零个站时无值;多个站时,如何合成一个县代表值没有官方规定——AQS 只做站点级统计,县与都市区的聚合由 AirData 的 AQI 汇总文件给出,但那是 AQI 的合并,不是浓度的合并。
| 县内站点数 | 常见处理 | 风险 |
|---|---|---|
| 0 | 剔除或从邻近县借值 | 借值会引入未记录的误差,且农村县系统性缺失 |
| 1 | 直接使用 | 单站代表性取决于选址,未必覆盖全县人口 |
| 2–5 | 算术平均或人口加权平均 | 两种平均在结果上差别可观,须在方法中写明 |
| 多于 5 | 通常只取监测设计站点 | 监测设计站与人口暴露站混杂 |
一个更稳的做法是保留站点级数据,在模型里用站点坐标而非县聚合,让空间项自己吸收异质性。代价是样本量下降、模型复杂度上升。
3.3 并址监测:同一片空气的两台仪器
同一站点同一参数由两台以上设备测量,就是并址监测。AQS 用 POC 区分它们,API 目前只提供监测仪级的值,站点级的值官方说"未来可能增加"。
对标准污染物(PM2.5、臭氧、铅、二氧化氮),联邦法规规定了把并址数据合成单一站点值的程序,分别在 40 CFR Part 50 的相关附录里。对其他参数,官方明确说:合成方式留给研究者决定。
这条规则的实际后果是:如果你在比对某个站点的 PM2.5 年均值与标准限值,而该站有三个 POC,直接取其中之一或取平均都可能与官方的合规值不同。要复现官方判定,必须按附录 N(PM2.5)或附录 R(铅)的程序计算。
3.4 用 POC 定位一台仪器
站点键加参数码只能定位到"某站某参数",同一站点若有两台设备测同一参数,还需要 POC 才能落到具体仪器。POC 是数字序号,通常从 1 起,并址设备依次递增。
下面的脚本从逐小时文件里按站点与 POC 取出全部行,并统计每台设备的有效小时数,用于判断并址设备是否需要合并。
#-- 输入:hourly_44201_2024.zip;输出:该站各 POC 的小时数与有效值数
import pandas as pd
df = pd.read_csv("hourly_44201_2024.zip",
dtype={"State Code": str, "County Code": str, "Site Num": str})
one = df[(df["State Code"] == "37") & (df["County Code"] == "183") & (df["Site Num"] == "0014")]
one = one[one["Parameter Code"] == 44201]
summary = one.groupby("POC").agg(
hours=("Sample Measurement", "size"),
valid=("Sample Measurement", "count"), # 非空即有效
flagged=("Qualifier", "count"), # 被标记的时次数
)
print(summary)
三列各有用途。小时数反映设备在线时长,有效值数反映真正测得的值,被标记数反映质控与事件的干扰程度。若两台 POC 的小时数与有效值都接近,说明它们是重复测量,做站点级分析前必须按法规程序合并,而不是简单相加。
3.5 网络(network)与运行机构
AQS 里的监测仪按行政原因划分为若干网络,同一网络内的监测仪使用相似的方法、操作规程与质控评估。官方同时提醒:如果关心的是某个参数,没有理由因为网络而人为限制检索范围。
网络划分影响的是可比性而非可用性。跨网络混合时,方法差异会被当成真实差异。用方法码做分层,比用网络做分层更接近问题本质。
运行机构则记录在监测仪描述文件里,包括所属机构与监测机构。这两者在部分州并不相同——土地归一个机构,运行归另一个。追责与致谢时用运行机构,读土地属性时用所属机构。
§4 测量层:这个数可不可信
定位解决了"属于谁",第二层解决"值不值"。AQS 把可信度拆成若干个独立标记,而不是给一个总分。
4.1 方法:FRM、FEM 与两者皆非
方法分三类:联邦参考法(FRM)、联邦等效法(FEM)、以及其他(非 FRM)。前两类须通过 40 CFR Part 53 规定的测试才能获得指定。
这个区分对 EPA 有意义,因为某些监管动作只能由 FRM 与 FEM 数据支撑。官方在 Primer 里明确说:数据是否对其应用具有足够的代表性,由使用者自行判断。
顺带一个常被忽略的事实:并非每个参数都有 FRM。没有参考法的参数,其"合规"概念本身就不成立,只能谈浓度与趋势。
4.2 采样时长:为什么"逐小时"是个误导性说法
逐小时文件只装了 1 小时时长的样本。但 AQS 里的样本时长谱系要宽得多,官方表格给出了各时长的样本占比(截至 2021 年 11 月 15 日):
| 样本时长 | 占比 | 最新报告年份 |
|---|---|---|
| 1 小时 | 88.37% | 2021 |
| 5 分钟 | 7.59% | 2021 |
| 24 小时 | 3.26% | 2021 |
| 3 小时 | 0.39% | 2021 |
| 2 小时 | 0.33% | 2021 |
| 其余十余种 | 合计不足 0.1% | 各异 |
读表要点:一小时的样本占了绝大多数,这正是"逐小时数据"这个说法的来源。但那 3.26% 的 24 小时样本承载了大量颗粒物与毒物监测,而且 24 小时样本往往每三天、每六天或每十二天才采一次——官方说明,这种采样频率本身是完全合规的,只是数据里的日间隔是设计使然,不是缺失。
所以"保证可得的离散时间间隔是日"这句话有两层含义:一是不存在比日更粗的强制粒度,二是不存在比日更细的保证。把小时文件当成"每小时都有值"会得到大量空档,把日汇总当成"每天都有值"同样会。
4.3 无效值如何编码
AQS 不使用单一的空值符号,空值的含义分几类,混在一起会出问题。
空样本(null sample):监测仪按计划应当采样但没有采,运营方须提交空数据原因,这是一个占位,告诉 EPA 后续不会有数据了。空样本不计入数据完整度,也不出现在部分公开报表与文件中。
异常事件限定符:野火、烟花是官方举的例子,这类事件影响空气质量但地方机构无法控制。被标记的值仍然是高质量的空气测量,只是出于州与联邦之间的法律用途被排除在合规判定之外。官方原话是:被标记的观测不是坏数据。
质控限定符:涵盖空数据、异常事件、自然事件与质量保证四类,最高等级的限定符写在该字段。
检出限:MDL 字段给出该方法的最小可检出浓度。历史上一度把低于 MDL 的值替换为二分之一的 MDL,官方现已停止这种做法,并移除了历史上的替换。也就是说,现在的 AQS 保留原始的低值与负值——官方说明,很多参数允许负值。若下游流程把负数当异常剔除,会把真实的低浓度信息丢掉。
| 现象 | 含义 | 正确处理 |
|---|---|---|
| 某小时没有行 | 未采样或数据未上报 | 按空样本处理,勿补零 |
| Qualifier 非空 | 被标记,可能是事件或质控 | 按研究目的决定纳入或排除,须在方法中说明 |
| 值为负 | 接近检出限的正常测量结果 | 保留或按检出限规则处理,勿直接删 |
| MDL 为空 | 该样本未报检出限 | 用该方法的标准 MDL 补,字段表中另有记录 |
4.4 汇总层的多重记录
日汇总与年度汇总不是"每条监测仪每天一行"这么简单。对标准污染物,同一监测仪同一天可能有多条汇总记录,官方给出三个原因:
第一,异常事件。若监测数据受事件影响,会额外生成两条汇总,一条排除提交机构标记的全部事件数据,一条排除 EPA 也认可的排除数据。
第二,标准更替。新标准颁布时通常附带不同的数据处理程序,AQS 为历史与法律原因保留按旧标准规则计算的汇总。
第三,标准形式含多个时长(如 1 小时与 8 小时),每个时长各算一份。
三者相乘的后果,官方举了一个具体例子:臭氧目前存有三套标准(1997、2008、2015 年颁布),对每个监测仪每一天,理论上可能有 3(事件)× 3(标准)× 2(时长)= 12 条日汇总。
十二这个数字是理解日汇总文件的关键。多数 AQS 数据产品已经过滤,只保留最新或最相关的那条,但预生成文件与 API 未必如此。直接在日汇总上做均值,会把同一天值重复计入十余次。
4.5 完整度:75% 这条线
EPA 判断一个汇总是"完整"的,标准是该时间层级上应有数据的至少 75% 实际可得。年度汇总的小时数据因此需满足 75% × 8760 = 6570 个样本;年度汇总的季度数据需满足 75% × 4 = 3 个季度汇总。
官方同时说明存在例外:某些浓度超标的情形下,即使完整度不足,汇总也可能被判为"有效"。每个汇总层级、每个参数的有效性判定指标写在数据字典里,数据集本身也有对应字段。
做年均值分析时,用 Observation Percent 与有效性字段双重筛选,比只看完整度更稳。
4.6 空白样品与质控七类:可信度的外部旁证
浓度本身无法自证。AQS 把"这个监测仪测得准不准"拆成七类独立的质控记录,通过 API 的对应服务取用:年度绩效评价、空白、并址评估、流量校验、流量审计、单点质控、绩效评价计划稽核。
七类的分工不同,读法也不同。
年度绩效评价要求每台主监测仪每年至少接受一次,做法是在若干已知浓度水平上测,用已知值与测得值的百分比差异评估监测数据质量。它是唯一覆盖全部主监测仪的统一检验。
空白样品指未暴露的采样介质,随暴露样品一同运输与处理,用来判断运输与操作过程是否引入污染。预生成文件里有专门的空白样品族,最早到 1999 年。
并址评估是同址同时的一对样品,由不同采样器采集。它与审计的区别在于:并址用的是"运行中"的采样器,审计用独立校准的采样器。
流量校验一年数次,由操作员现场测定流量;流量审计一年至少两次,由专家用不同于校验的方法复核。这两项只针对颗粒物监测仪。
单点质控要求某些气体监测仪至少每两周用已知浓度挑战一次,以判定仪器性能。
在建模里,这七类数据的用途是分层而非特征:把质控结果作为站点-年的筛选条件,剔除质量下行的站点,比把质控指标直接塞进模型更有依据。
| 质控类型 | 频率要求 | 覆盖对象 | 主要用途 |
|---|---|---|---|
| 年度绩效评价 | 每台主监测仪每年一次 | 全部主监测仪 | 判断监测网整体质量 |
| 空白 | 按批次 | 采样介质 | 排除运输与操作污染 |
| 并址评估 | 定期 | 运行中的采样器 | 评估重复测量一致性 |
| 流量校验 | 一年数次 | 颗粒物监测仪 | 保证采样体积准确 |
| 流量审计 | 一年至少两次 | 颗粒物监测仪 | 独立复核流量 |
| 单点质控 | 至少每两周 | 部分气体监测仪 | 判定仪器响应性能 |
| 绩效评价稽核 | 按计划 | 主质量保证机构 | 评估整体不确定度 |
4.7 一个贯穿全文的案例:2018 年夏天的臭氧与野火
这一节用一个官方文档能支撑的场景把上述规则串起来。2018 年夏季,北美西部多起野火把烟羽推进城市,表现为臭氧与 PM2.5 的同步抬升。这在本库的用法是:
第一,在小时文件里定位。取 hourly_44201_2018 与 hourly_88101_2018 两份文件,按州码与日期筛选受影响站点的小时值,看峰值时刻是否一致。野火烟羽与城市光化学的日变化形态不同,前者往往不打散。
第二,在日汇总里看事件限定符。同一天的记录里,Qualifier 非空的行通常就是被提交机构标为异常事件的那条;同时还有事件类型为"含事件"“排除提交方标记事件”"排除双方认可事件"的并行记录。
第三,在年度汇总里看事件类型字段。此时同一监测仪同一标准下会出现多条年度记录,它们的年均值不同,差异就是被排除事件数据贡献的量。
第四,在下游产品里看不到这一层。AirData 的多数报表只给一个数,通常是最新标准、含事件的版本,从报表上看不出这一层分歧。
这套走法的普遍意义在于:AQS 里同一个"值"其实是一族值,按是否含事件、按哪套标准、按哪个时长排列。选哪一个不是技术细节,而是研究问题的一部分——评估人群实际暴露,应当含事件;评估是否达标,应当按合规口径。
§5 取数层:三条通道与它们的边界
第三层解决"怎么把数据搬到自己这边"。
5.1 三条通道的分工
官方在各处反复强调同一件事:聚合或浏览用 AirData,逐行原始数据用 API。API 文档开头就写:若需要聚合的或可视化的数据,或大量预先抽取的文件,应当从 AirData 起步。
| 通道 | 形态 | 适合 | 不适合 | 更新 |
|---|---|---|---|---|
| 预生成文件 | 压缩 CSV,按参数与年打包 | 批量下载、离线复算、教学 | 小规模单次查询 | 年两次 |
| AQS API v2 | REST + JSON,需 key | 按地理与时间精确取数、脚本化 | 上百 GB 级别的整体拉取 | 与库同步,但受上报滞后约束 |
| AirData 查询界面 | 网页表单与图表 | 快速查看、出图 | 可复算的批量分析 | 同文件 |
三者取的是同一份数据,差别在组织方式。把小规模查询交给文件、把批量下载交给 API,都会浪费时间。
5.2 预生成文件的命名与层级
文件名自带三个维度:聚合层级、参数或参数组、年份。核心规律如下。
#-- 文件名构成:<聚合前缀>_<参数码或组名>_<年份>.zip
hourly_44201_2024.zip # 臭氧,逐小时,2024 年,全国
daily_88101_2024.zip # PM2.5,逐日汇总,2024 年
8hour_44201_2024.zip # 臭氧,8 小时滑动平均
annual_conc_by_monitor_2024.zip # 全部参数,年度汇总,监测仪级
annual_aqi_by_county_2024.zip # AQI 年度汇总,县级
blanks_all_2024.zip # 空白样品(质控)
年度汇总文件小到可以把全部数据装进一个文件,因此不带参数码。其余层级都按参数或参数组拆分,组名包括标准气体、颗粒物、气象、毒物(含核心有害空气污染物与挥发性有机物)、臭氧前体物与铅。
文件页面上每一行都带四样东西:文件名、压缩后大小、数据行数、最后修改日期。最后修改日期是判断该文件是否已随批次重刷的主要依据。
5.3 批次节奏:一年两次,不是逐日
预生成文件每年更新两次。文件页的说明是:一次在六月前后,取上一年的完整数据;一次在十二月前后,取当年臭氧季(夏季)的数据。Primer 的表述略有出入,写的是名义上的五月与十一月,五月那次意在给出上一日历年的首个完整数据集,十一月那次意在给出当年臭氧季的首个完整数据集。两处措辞不同,指向的是同一个两批次机制。
文件页自身把节奏写得最具体:页面最后刷新于 2026-06-25,当日所有文件的修改日期均为此日,而当年度文件只到 6 月下旬。
由此可以确定地回答一个常见疑问:AQS 不是逐日更新的。它是一条季度上报、年度两次发布的链路,从采样到进入文件可能跨越半年以上。任何"每日同步"的设想都会落空。
5.4 API 的最小可用调用
AQS API v2 的地址在 aqs.epa.gov/data/api。官方提供的测试账号是 test@aqs.api / test,调用次数有限,仅够验证连通性。
#-- 先确认服务在不在;返回 status 字段即可判断
curl -s "https://aqs.epa.gov/data/api/metaData/isAvailable?email=test@aqs.api&key=test" \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["Header"][0]["status"])'
#-- 取某州某参数某年的年度汇总,用于判断数据是否存在及其观测数
curl -s "https://aqs.epa.gov/data/api/annualData/byState?email=test@aqs.api&key=test¶m=88101&bdate=20230101&edate=20231231&state=01" \
| python3 -c 'import json,sys; d=json.load(sys.stdin); print(d["Header"][0]["rows"]); print(sorted(d["Data"][0].keys())[:12])'
第一段的意义在于:服务是否健康只能靠 metaData/isAvailable 判断,读文档看不到。第二段返回的行里,observation_count、observation_percent、validity_indicator、valid_day_count 是判断"这里到底有没有足够数据"的四个字段,官方也建议用它来估算某时间-参数-地理组合的数据量。
取样本数据用 sampleData/bySite 一类的服务,返回字段名与预生成文件不同——用下划线连接的小写名,例如 sample_measurement、date_local、detection_limit、method_type。写代码时不要假设两套字段名一致。
5.5 请求限制
官方给出的约束有四条,全部是硬性的:
一,除监测仪服务外,所有服务的结束日期必须与开始日期在同一年。二,单次请求最多列 5 个参数码。三,建议单次查询不超过百万行。四,脚本请求须等前一个完成再发下一个,每分钟不超过 10 次,两次之间间隔 5 秒,并按响应大小调整。
违反后的后果是账号可能被停用。官方说的是"不另行通知,但会通过注册邮箱联系"。
5.6 数据字典:四十余个字段的定义与算法
官方数据字典按字段名字母序排列,每个字段给出叙述性定义、赋值规则、计算公式与相关字段的交叉引用。它不按表结构组织,而是按字段组织——这带来一个实务后果:想弄清某张表有哪些字段,得去文件格式文档;想弄清某个字段怎么算出来的,才去数据字典。
对做暴露计算的人,字典里最值得先读的是三组字段。
汇总层的统计量:各百分位(第 5、10、25、50、75、90、98 百分位)的定义是"数值小于或等于该百分位的样本值",并且对臭氧与 PM2.5 分别采用日均最大值与季节算法。同一套字段名,不同参数背后的算法不同。
完整性相关:数据百分比、观测数、应有观测数三者互相定义,字典给出的是取最小值或取比值的具体表达式,而不是"大约"。
质控类:单点质控的偏倚估计、偏倚符号、所需检查次数、数据完成百分比,每个都有成文的计算公式。做监测网质量分层时,直接按字典的公式复算,比用第三方实现的近似更稳。
一个提醒:字典里不少公式用数学排版渲染,需要 JavaScript 才能正确显示。在无脚本环境里读到的公式可能是残缺的,涉及具体算法时应换到浏览器环境核对。
5.7 用 R 或 Python 落地
EPA 发布了基于该 API 的 R 包,托管在 CRAN。Python 侧没有官方包,下面的最小示例用标准库即可,关键在第 4 行的节流与第 7 行的年份切分。
#-- 按县逐年拉取 PM2.5 日均值;县内站点会返回多行,聚合在本地做
import json, time, urllib.request
EMAIL, KEY = "you@example.org", "YOUR_KEY" # 换成自己的注册账号
BASE = "https://aqs.epa.gov/data/api"
def fetch_county(state, county, param, year):
url = (f"{BASE}/dailyData/byCounty?email={EMAIL}&key={KEY}"
f"¶m={param}&bdate={year}0101&edate={year}1231"
f"&state={state}&county={county}")
with urllib.request.urlopen(url, timeout=120) as r:
body = json.load(r)
time.sleep(5) # 官方要求两次请求间隔 5 秒
return body.get("Data") or []
rows = []
for y in range(2015, 2025): # 起止必须同年,故按年循环
rows += fetch_county("37", "183", "88101", y) # 北卡 Wake 县
print(len(rows), rows[0]["arithmetic_mean"] if rows else None)
两处必须这么写的原因:API 不接受跨年区间,按年循环不是风格而是限制;两次请求之间睡 5 秒也是官方条款,去掉会在百次以内触发封禁。
§6 与站内相邻资源的关系
环境方向在库内目前只有三条化学品毒理资源,补的正是暴露-结局链路里缺失的暴露半边。
6.1 关系图谱
| 关系 | 站内资源 | 关系性质 |
|---|---|---|
| 同机构、不同端点 | toxcast(rid 194) | 同为 EPA,一为体外毒性、一为环境浓度,可拼"浓度-毒性"两端 |
| 同机构、不同端点 | comptox-dashboard(rid 1125) | 化学品身份与暴露信息的聚合门户,AQS 是其中的空气介质来源 |
| 同机构、不同端点 | tox21(rid 93) | 联邦跨机构体外筛选,与 AQS 无重叠 |
| 暴露-结局配对 | nhanes(rid 99) | 按县-年对齐,把空气浓度作为调查对象的环境协变量 |
| 结局侧的替代 | cdc-wonder(rid 155) | 死亡与发病统计,可与 AQS 做生态学关联 |
| 结局侧的替代 | brfss(rid 165) | 自报健康与行为,县-年粒度,可与 AQS 对齐 |
| 尺度对照 | fair-health-atlas(rid 1207) | 医保理赔的县-州患病率,可做效应侧的县级对照 |
| 全球尺度对照 | who-gho(rid 175) | 国家级卫生指标,AQS 只覆盖美国,二者不可直接拼接 |
6.2 暴露-结局链路的具体拼法
站内三条化学品资源都在链路的上游:它们回答"某种物质在体外或体内会不会造成伤害"。它们不回答"人群实际吸入了多少"。AQS 补的正是这一段。
以 nhanes 为例,可行的拼法是:取调查者的县码与调查年,按县-年取该县 AQS 站点的年均浓度与日均浓度分布,作为个体记录的环境协变量。需要注意三点:NHANES 的地理标识受保密限制,公开版本只到大区而非县;县-年对齐要靠加权而非简单平均;调查年与污染年不是同一年时,要用窗口而非单点。
| 组合方向 | 需要的键 | 已知障碍 |
|---|---|---|
| AQS × nhanes | 县码 + 年 | 公开版地理精度不足,需受限数据 |
| AQS × brfss | 县码 + 年 | BRFSS 县标识在部分年份不全 |
| AQS × cdc-wonder | 县码 + 年 | 死亡登记与暴露之间需时滞假设 |
| AQS × fair-health-atlas | 州-县 + 年 | 理赔数据为保险人群,选择性偏倚 |
| AQS × 毒理三条 | 参数码 / 化学身份 | 需建立参数码到化学物的映射,见 §2.3 |
最后一行是这条路里最费工的一段。AQS 的参数码是自有体系,毒理资源用 CAS 或 DSSTox 标识,两者之间没有官方对照表,要自己建立并逐条核对。
6.3 从浓度到毒性的四步桥
站内三条毒理资源提供的是"某物质在某浓度下是否产生生物效应",AQS 提供的是"某地空气中该物质的浓度是多少"。要把它接成一条完整证据链,需要四步,且每一步都有卡点。
第一步,物质对应。 把 AQS 参数码映射到化学物标识。参数码是自有体系,不指向 CAS,也没有官方对照表。常见标准污染物与毒物可直接人工建表,组分类参数(例如颗粒物中的各种金属)需要逐条核对粒径分级。
第二步,浓度可比。 毒理实验的剂量单位多为微摩尔每升或微克每毫升(溶液浓度),环境浓度是每立方米空气中的质量。两者的换算依赖吸入剂量模型,不能直接比较数值大小。
第三步,时间尺度。 体外实验是小时到天,环境暴露是年到十年。把短期体外效应外推为长期人群风险,需要暴露-反应模型,而不是阈值比较。
第四步,人群差异。 体外筛选用的是细胞系,环境暴露的人群含儿童、老年人、既有疾病者。前者不区分易感性,后者必须区分。
四步都做完,才构成"物质—浓度—暴露—效应"的闭环。跳过任一步直接说"某地空气含有某毒物,因此有害",在方法上是不成立的。
6.4 检索路径
| 你的起点 | 建议路径 |
|---|---|
| 已有健康数据,要加暴露 | 先定县-年键 → 取 station 列表筛县 → 取年度或日汇总 → 本地聚合 |
| 已有空气研究,要配对结局 | 先定研究窗口 → 取小时文件做暴露度量 → 再找结局侧资源 |
| 关心某化学物的健康影响 | 从毒理资源取机制证据 → 用 AQS 参数码定位对应监测 |
| 关心政策与趋势 | 取年度汇总的多年序列 → 逐年检查参数集与标准版本 |
6.5 互链
需要体外毒性证据时看 toxcast;需要化学品身份与跨介质信息时看 comptox-dashboard;需要人体生物监测与健康测量时看 nhanes;需要死亡登记做时间序列时看 cdc-wonder;需要医保理赔侧的县级患病率对照时看 fair-health-atlas。
§7 质量评估与局限性
7.0 阅读本节前需要知道的一件事
评价 AQS 时最容易出现的框架错位,是用"数据集"的标准去要求一个登记系统。
如果按数据集看,它的缺陷一目了然:没有版本、没有冻结、没有统一采样频率、没有插值、没有厂商级质控评分、甚至没有一个可以引用的一次性下载包。
但它不是数据集。它的产品是**“每一台监测仪每一个时刻的空气浓度,以及它为什么可以是这个值”**。评价它应该用登记系统的标准:覆盖是否完整、来源是否可追、修改是否留痕、口径是否成文。
这两种评价框架的差别,决定了你会觉得它"数据质量差"还是"元数据极全"。下面的评估按登记系统的标准进行,各项检查以本库使用的数据集文档化框架简称为 DAIMS。
7.1 已知偏倚
| 类型 | 描述 | 严重程度 | 缓解 |
|---|---|---|---|
| 选址偏倚 | 站点按监管要求布设,非人口加权;都市与近路站点相对密集 | 高 | 用站点坐标建模,或对县内做人口加权 |
| 覆盖偏倚 | 农村县长期无站点,缺失非随机 | 高 | 借值须记录,或用卫星反演补 |
| 参数漂移 | 任一年度参数少于 700,历史累计逾千 | 中 | 按年核对参数集,跨年比较前先做集合交集 |
| 方法异质 | 同参数多方法码,FRM/FEM/非 FRM 并存 | 中 | 按方法码分层,不跨方法直接平均 |
| 并址重复 | 同站同参数多 POC,可能被重复计入 | 中 | 按法规程序合成站点值 |
| 事件混入 | 野火、烟花被标记但仍是真实空气样本 | 低 | 按研究目的选择是否排除,并写明 |
第一条与第二条是同一枚硬币的两面:监管布站的目的是判断达标与否,不是刻画人群平均暴露。用它做流行病学的暴露估计,先天带着这两条。
7.2 数据质量的四道闸
AQS 的可信度不是靠一个评分,而是四道彼此独立的闸。
第一道,上报时限。 名义上按季度上报,季度结束后 90 天内提交;多数毒物、挥发性有机物与部分光化学评估监测站数据的期限是 180 天。
第二道,年度认证。 强制上报的数据须在次年 5 月 1 日前由提交机构认证完整无误,这常导致上一年度数据的重报与标记。
第三道,质控数据旁证。 API 提供七类质控服务:年度绩效评价、空白、并址评估、流量校验、流量审计、单点质控与绩效评价计划稽核。这些是把浓度可信度量化出来的唯一官方途径。
第四道,EPA 的修改权。 只在特殊情形下 EPA 会改动已提交的数据,例如某方法被证明不足以表征某参数,此类数据会被转到更合适的参数下,如带"未核实"限定语的同名参数。
7.3 DAIMS 24 项检查
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | 预生成文件为宽表 CSV,一表一参数一年 |
| 2 | 唯一标识 | ✅ | 站点键 + 参数码 + POC + 双时区时间戳 |
| 3 | 特殊字符 | ⚠️ | 方法名含逗号与括号,须引号包裹;负号在部分工具中编码不一 |
| 4 | 重复行 | ⚠️ | 日汇总对标准污染物可生成十余条并行记录,非错误 |
| 5 | 缺失编码 | ⚠️ | 空样本、限定符、负值并存,无单一哑值 |
| 6 | 标签标识 | ✅ | 参数码、方法码、限定符码均为受控编码表 |
| 7 | 罕见类分组 | ⚠️ | 一千余参数中多数学年样本稀少,需分组 |
| 8 | 偏倚评估 | ⚠️ | 官方有成文说明,无量化偏倚指标 |
| 9 | 数据字典 | ✅ | 官方数据字典按字母序逐字段定义并给算法 |
| 10 | 信息性缺失解释 | ✅ | 空样本原因字段与限定符码即信息性缺失 |
| 11 | 设备记录 | ✅ | 监测仪描述文件含方法、网络、运行机构与起止 |
| 12 | 共线性 | ❌ | 同站多参数高度相关,官方不提供处理建议 |
| 13 | 编码映射 | ⚠️ | 参数码为自有体系,无官方到 CAS 的对照 |
| 14 | 时间戳处理 | ✅ | 本地标准时与 GMT 并列,明示不做夏令时调整 |
| 15 | 划分建议 | ❌ | 无训练/验证划分概念,属监测数据 |
| 16 | 泄漏讨论 | ⚠️ | 建模时相邻小时高度自相关,需自行按时间切分 |
| 17 | 标签分布 | ⚠️ | 参数与站点分布极不均衡,无官方分布表 |
| 18 | 测量偏倚 | ✅ | 方法类型、检出限、不确定度字段齐备 |
| 19 | 外部验证建议 | ⚠️ | 无官方建议;毒物数据被引导至毒物档案 |
| 20 | 版本记录 | ❌ | 明示无版本化无冻结,仅逐行变更日期 |
| 21 | 预处理脚本 | ⚠️ | 官方仅提供 R 包,无端到端清洗脚本 |
| 22 | 合规要求 | ✅ | 公共领域,无使用限制 |
| 23 | 多模态对齐 | ⚠️ | 与健康数据靠县-年键对齐,精度受县码粒度限制 |
| 24 | 去标识化 | ✅ | 记录为环境测量,无个体信息 |
DAIMS 评分:15.5 / 24。
评分解读:满分集中在"可追"类——唯一标识、字典、设备记录、时间戳、测量偏倚、合规与去标识化,这七项恰好是登记系统的核心。丢分集中在"可建模"类——共线性、划分、版本记录三项直接判否,因为它本来就不为建模设计;参数映射、标签分布、外部验证等弱项,都是"官方不做,留给使用者"。
对你意味着什么:把它当调查数据用,而不是当基准数据用。上手第一步不是建模,而是写好取数日期、版本批次与聚合口径这三项元数据;第二步是建立参数码到研究用化学物的本地对照表;第三步才是把站点聚合到分析单元。
7.4 缺失不是随机的:三张分布
要判断一个缺失会不会破坏分析,得先知道它缺在哪个维度。AQS 的缺失在三个维度上都不是随机。
时间维度的缺失来自采样设计。间歇法按每三天、每六天、每十二天采一次,日间隔完全合规却表现为大量空缺。这类空缺若被当作随机缺失删除整段,会删掉整个站点的序列;正确做法是按设计频率推算应有观测数。
空间维度的缺失来自布站逻辑。站点按达标判定需要布设,人口稠密的都市区与近路位置站点密集,农村县往往整县无站。把这个缺失当成随机,等于默认农村人群的暴露与城市相同,而这正是环境流行病学里最有争议的假设之一。
参数维度的缺失来自监管重点的迁移。任一年度出现的参数少于七百个,全历史累计逾千;某个参数在 1990 年代有、之后停测,会造成跨年比较时的假性下降——不是空气变干净了,是没人测了。
| 维度 | 缺失成因 | 表现 | 处理 |
|---|---|---|---|
| 时间 | 间歇法采样设计 | 日间隔不规则 | 按设计频率计算应有观测数 |
| 空间 | 布站依据达标而非人口 | 农村县整县无站 | 保留缺失,或在模型中显式建模 |
| 参数 | 监管重点迁移 | 某参数中途停测 | 跨年比较前先取参数集合交集 |
第三行的处理常被忽略。研究某种毒物二十年趋势时,若不先核对各年在测站点数,会把"监测网收缩"读成"浓度下降"。
7.5 与健康数据对齐时的外部验证
库内尚无对该库的外部验证记录,下面给出的是对齐方向而非性能数字。
| 对齐对象 | 场景 | 需要先行验证的事 |
|---|---|---|
| nhanes 环境子集 | 个体生物标志物与环境浓度的相关性 | 地理识别精度是否足以支持县-年键 |
| cdc-wonder | 日死亡数与日浓度的短期关联 | 死亡日期与暴露窗口的时滞设定 |
| brfss | 自报症状与长期暴露 | 县标识在目标年份是否完整 |
| fair-health-atlas | 县级患病率与长期暴露 | 参保人群与全人群的构成差异 |
§8 版本与生态
8.1 更新节奏与可复现性
一年两个批次,批次日期就是版本号。除此之外没有语义版本,没有 release notes,没有变更摘要。可追踪的变化只有两处:文件页的"最后修改日期",以及每行记录里的"最后变更日期"。
两者作用不同。前者告诉你文件何时被重刷,后者告诉你某一行何时被改。官方提醒,最后变更日期会因非数值字段的修改而更新,例如提交机构发现某样本的采集方法或检出限填错而只改了那个字段,此时变更日期与数值实际变化并不同步。
由此得到的实践规则是一条:每次取数后,把批次日期与该批文件的校验和存档。这是这套系统里唯一可用的复现手段。
8.2 生态位
AQS 位于美国空气质量数据链条的底部,上游是数千家州、地方与部落机构的监测计划,下游是三类出口:
面向公众的出口是 AirData,提供报表、图表、地图与预生成文件;AirData 的多数工具只展示标准污染物。2026 年 10 月核对时,AirData 首页正在推广新版界面,并注明旧版工具将保留至 12 月 18 日。
面向开发者的出口是 AQS API v2,2019 年改版,网址从 aqs.epa.gov/api 迁到 aqs.epa.gov/data/api,旧址在过渡期内并存。改版取消了查询辅助界面与异步请求,输出一律 JSON,查询体积上限被取消,改为按账号滥用情况单独限流。
面向专门用途的出口是毒物档案,官方建议毒物数据从这里取,因为它含 AQS 之外的来源、附加质控与更宽松的减缩规则;AQS 保留毒物数据,只是为了与其他数据格式一致。
关于 API 是否仍在使用:服务健康检查在 2026 年 10 月 28 日返回正常,参数列表服务可用,年度汇总服务可返回数据。文档页的"最后更新"仍停在 2020 年 1 月 10 日,这是文档层面的停滞,不是服务中止。
8.3 许可与再分发
这条数据在美国版权法下没有版权——它是联邦政府雇员在职务范围内完成的作品。后果不只是"免费",还包括两点:可以修改后重新发布,不需要标注改动;可以与任何其他许可的数据合并,不产生许可冲突。
两点实务提醒仍然成立。其一,引用与致谢是学术惯例而非法律义务,但缺了它会让复核者难以定位版本;其二,库中来自州与地方机构的数据,其原始采集与质控发生在州层面,EPA 只在中央做了统一处理——致谢写成"州、地方与部落空气污染控制机构"比只写 EPA 更准确,官方 Primer 在数据所有权一节专门强调了这一点。
8.4 历史沿革
这条脉络有几处关键节点,都能在官方文档里找到依据。
AQS 及其前身接受并存储这类数据已超过五十年,目前库中逾 30 亿条测量。1970 年《清洁空气法》确立了监测义务,具体技术要求写在 40 CFR Part 58。上世纪七十年代末的臭氧监测规程修订(44 FR 8202)把 1980 年变成可比口径的分界。1999 年的 PM2.5 监测强制实施(62 FR 38652)让监测仪数量跃升。2015 年 12 月,预生成文件的 VOC 列表扩充并重刷全部 VOC 文件。2019 年 API 改版。
沿着这条线看,AQS 的变化几乎都由法规驱动,而不是由数据产品驱动。这解释了它为什么在"数据集友好"这件事上长期不改进:改进的动力来自合规,不来自使用者。
8.5 为何能持续
一个没有版本、没有营销、界面停留在 2015 年文档水平的系统,能持续六十年,靠的不是设计,而是三重刚性。
法律刚性。 监测上报是法定义务,不上报即违规。数据供给方没有退出选项。
使用刚性。 达标判定的法定依据在库里。任何想要质疑或复现某个达标结论的人,最终都必须回到这里。
格式刚性。 四十余个州级机构、数百个地方机构的数据要在同一张表里比较,唯一的公约数就是这个库的字段结构。替代它的成本不是技术成本,而是协调成本。
再加上开放许可这一条:美国联邦政府作品无版权,任何人可以自由再分发。这去掉了一层法律摩擦,使它在学术与商业场景里都被默认接受。
8.6 与 AirNow、AirData 的分工
这三者的混淆是使用这个库最常见的错误来源,需要单独说清。
AQS 是库。它存所有经质控的监测数据,滞后半年以上,只有原始值与若干层汇总。
AirData 是门。它是同一条库的公众出口,提供预生成文件、查询界面与图表,多数工具只到标准污染物。它不产生新数据。
AirNow 是另一条链。它是实时与当日空气质量报告与预报系统,数据以小时级流动。官方在 Primer 里写明:本文档不适用于 AirNow 系统;需要实时信息时请去 AirNow API。
三者的关系可以一句话概括:要历史与可复现,用 AQS;要现成的报表与图,用 AirData;要此时此刻,用 AirNow。AirNow 的数据不进 AQS,AQS 的数据不出现在 AirNow;试图把两者混在一条时间序列里,会在衔接处出现口径断层。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 第三步 |
|---|---|---|---|
| 做暴露-结局关联的研究者 | 定分析单元(县或站点) | 取年度汇总建协变量 | 与健康数据按县-年连接 |
| 做空气质量建模的工程师 | 取小时文件建真值集 | 按方法码与限定符筛 | 按时间切分防泄漏 |
| 做政策与趋势分析的机构 | 取多年年度汇总 | 逐年核对参数集与标准版本 | 按事件类型选择口径 |
9.2 最小实现:从文件到县-年暴露表
下面的脚本只依赖标准库与 pandas,读一份年度汇总文件,输出县-年浓度表。关键在于按方法类型与有效天数筛选,并在聚合前处理并址。
#-- 输入:annual_conc_by_monitor_2024.zip(官方年度汇总,全部参数)
#-- 输出:DataFrame[state, county, year, param, mean_conc, n_sites]
import pandas as pd
df = pd.read_csv("annual_conc_by_monitor_2024.zip", dtype={"State Code": str, "County Code": str})
df = df[(df["Parameter Code"] == 88101) & (df["Validity Indicator"] == "Y")]
df = df[df["Event Type"] == "No Events"] # 口径一:仅无事件,做暴露用
df = df[df["Observation Percent"] >= 75] # 口径二:完整度达标
df = df[df["Method Type"].isin(["FRM", "FEM"])] # 口径三:只认参考法与等效法
#-- 站点级:同站多 POC 先按监测仪平均,再上卷到县
site = (df.groupby(["State Code", "County Code", "Site Num"])
.agg(mean_conc=("Arithmetic Mean", "mean")).reset_index())
county = (site.groupby(["State Code", "County Code"])
.agg(mean_conc=("mean_conc", "mean"), n_sites=("Site Num", "nunique")).reset_index())
county["year"] = 2024
print(county.head(), len(county))
三处筛选都是口径选择而非清洗:含事件与否改变的是"人群暴露"与"是否达标"两种问题;完整度线影响小站点留存;方法类型把非参考法排除在合规链路之外。三者都须在方法学中写明。
9.3 从 API 取单站时间序列
文件适合批量,单站精细分析走 API 更省事。下面的脚本取某一站点一年的臭氧日均值,并把事件类型与完整度一并留下,便于后续决定是否排除。
#-- 取单站日汇总;返回字段名与预生成文件不同,为小写下划线式
import json, urllib.request
def site_daily(state, county, site, param, year):
url = ("https://aqs.epa.gov/data/api/dailyData/bySite"
f"?email=you@example.org&key=YOUR_KEY¶m={param}"
f"&bdate={year}0101&edate={year}1231"
f"&state={state}&county={county}&site={site}")
with urllib.request.urlopen(url, timeout=120) as r:
return json.load(r).get("Data") or []
rows = site_daily("37", "183", "0014", "44201", 2024)
keep = [r for r in rows if r["event_type"] == "No Events"
and (r["observation_percent"] or 0) >= 75]
print(f"全年行 {len(rows)},筛后 {len(keep)}")
print({k: keep[0][k] for k in ("date_local", "arithmetic_mean", "aqi", "valid_day_count")} if keep else "无数据")
筛选逻辑与文件版一致:事件类型取"无事件"对应人群暴露口径,观测百分比线取 75% 对应官方完整度定义。若要复算达标,则应保留"事件排除"那一条并改用有效天数。
9.4 在 AI 流程中的位置
这个库很少直接进模型,更多是作为特征来源或评估真值。三种典型位置:
| 位置 | 输入 | 输出 |
|---|---|---|
| 特征工程 | 县-年浓度统计量 | 健康模型的暴露协变量 |
| 模型评估 | 站点级时间序列 | 空气质量预测模型的真值 |
| 预训练辅助 | 站点坐标与参数组合 | 空间与化学结构的先验 |
第三种用法需要警惕泄漏:同一监测仪的相邻小时高度相关,随机切分会让模型在测试集上虚高。按时间或按站点切分是必要条件。
§10 使用声明
| 项 | 内容 |
|---|---|
| 数据性质 | 环境空气监测记录,非个体数据 |
| 推荐用途 | 暴露协变量、趋势分析、模型真值、达标复算 |
| 不建议用途 | 实时播报、个人暴露估计、未经处理的县均值 |
| 隐私与伦理 | 无个体信息;站点地址为公共监管设施 |
| 许可 | 美国政府作品,无版权,可再分发 |
| 引用要求 | 建议注明系统名称、取数日期与批次 |
| 版本风险 | 无冻结机制,历史值可被追溯修改 |
| 页面状态 | published |
三条红线值得单独重申。
不要把它当实时源。 任何标着"最新"的空气数据页面,若背后是 AQS,延迟至少是一个季度。把滞后半年的数字呈现给公众当作当下状况,是使用层面最严重的一类错误。
不要隐藏聚合口径。 从站点到县的每一步都做了选择:平均方式、完整度门槛、是否含事件、用哪个标准版本。这些选择写出来,结果才可复现;省略它们,结果只能被相信。
不要用个人层面的语言描述群体关联。 由县-年浓度与县-年发病率得到的关联,结论层面停留在群体;改写为"住在某地的人因空气患病的风险增加多少",是把生态学关联个体化,属于推论越界。
常见误读
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| “AQS 是逐日更新的” | 预生成文件每年两批,样本上报有 90 至 180 天滞后 | 文件页与 Primer 的更新节奏说明 |
| “AQS 有实时数据” | 明确没有,实时数据在 AirNow | Primer 第 2.4 节与 7.1 节 |
| “AirData 和 AQS 是两个库” | 同一份库,AirData 是其公众出口 | Primer 第 2.1 节;API 文档开头 |
| “AirNow 是 AQS 的实时视图” | 独立系统,数据不进 AQS | Primer 明示本文档不适用于 AirNow |
| “每个县都有监测值” | 无站即无值,官方不做插值 | Primer 第 3.2 节 |
| “1980 年之前没有数据” | 有,最早 1957 年,但可比性差 | Primer 第 3.1 与 3.1.1 节 |
| “参数就是污染物” | 含气象等非污染物,官方明确措辞不适用 | Primer 第 3.3 节 |
| “低于检出限的值被替换成一半 MDL” | 已停止该做法并移除历史替换 | Primer 第 4.2.1 节 |
| “负值是错误数据” | 很多参数允许负值,属正常测量结果 | Primer 第 5.3 节 |
| “日汇总每天只有一行” | 标准污染物可并行十余条记录 | Primer 第 4.2.2 节 |
| “监测仪数就是仪器台数” | 一台采样器测 42 种物质记为 42 个监测仪 | Primer 第 6 节 |
| “Data Mart 已停用” | 服务在运行,API v2 为现行接口;文档页停滞于 2020 年 | 2026-10-28 健康检查返回正常 |
FAQ
Q1:AQS 和 AirData 到底哪个是数据集? 两个都是同一份数据。AQS 是底层库,AirData 是官方门户。下载文件、看报表走 AirData,逐行取数走 AQS API。
Q2:我要的是昨天某个城市的空气质量,能用 AQS 吗? 不能。昨天的数据通常还没进 AQS。这类需求用 AirNow。
Q3:站点数到底是四千还是两万? 官方站列表中一万出头的是"监测点"口径与"站"口径的混合,页面给出的站列表行数是两万这一档,监测仪列表是三十七万这一档。任一年度实际运行的站点数远小于累积登记数。
Q4:污染物有多少种? 任一年度出现的参数少于 700 个,全部年份累计 1,177 个,系统登记口径更多。三个数都出自官方,但口径不同。
Q5:为什么我的年度文件里有重复的监测仪? 因为同一标准污染物在同一年会按事件类型、标准版本与时长各生成一条汇总。这是设计,不是脏数据。
Q6:我能拿到逐小时的历史数据吗? 可以,但只有 1 小时时长的样本进逐小时文件。5 分钟、24 小时的样本要在日汇总或按申请获取。
Q7:为什么同一个县在不同论文里的年均值不一样? 多半是口径不同:是否含事件、用哪套标准、用几个站点、是否人口加权。AQS 不给唯一答案。
Q8:API 要钱吗? 不要,但需要注册拿 key。官方给的测试账号调用次数有限。
Q9:能商用吗? 可以,美国联邦政府作品无版权。但再分发时建议注明来源与取数日期。
Q10:毒物数据该从哪取? 官方建议从毒物档案取,附加了质控与减缩。AQS 里的毒物数据只为与其他数据格式一致而保留。
术语表
| 术语 | 含义 |
|---|---|
| AQS | Air Quality System,美国环保署环境空气监测总库 |
| AirData | EPA 的空气质量数据公众门户,预生成文件与报表在此 |
| AirNow | 实时与预报空气质量系统,独立于 AQS |
| 站点 site | 一个地理位置,可运行多个参数 |
| 监测仪 monitor | "某站点测某参数"这件事,不是物理设备 |
| POC | Parameter Occurrence Code,同站同参数多设备的区分序号 |
| 参数 code | AQS 自有的五位数字编码,不等于 CAS 号 |
| FRM | 联邦参考法 |
| FEM | 联邦等效法 |
| 标准污染物 | 已颁布国家环境空气质量标准的污染物 |
| NAAQS | 国家环境空气质量标准 |
| 样本时长 | 一次采样所覆盖的时间长度,5 分钟至 24 小时 |
| 空样本 | 应采未采的占位记录,不计入完整度 |
| 异常事件 | 野火、烟花等地方无法控制的影响源 |
| 并址 | 同站同参数由多台设备同时测量 |
| MDL | 方法检出限 |
| 完整度 | 实际观测占应有观测的比例,年汇总以 75% 为线 |
| 污染物标准 | 汇总所依据的标准版本,决定数据处理规则 |
| HAP | 有害空气污染物 |
| Data Mart | AQS 的查询与发布后端,API 即其接口 |
附录 A:文件命名与分层
| 前缀 | 层级 | 粒度 | 是否按参数拆分 |
|---|---|---|---|
hourly_ |
逐小时 | 监测仪 × 小时 | 是 |
8hour_ |
8 小时滑动平均 | 监测仪 × 8 小时块 | 是(仅臭氧与一氧化碳) |
daily_ |
日汇总 | 监测仪 × 日 | 是 |
daily_aqi_ |
日 AQI | 县或都市区 × 日 | 否 |
annual_conc_by_monitor_ |
年汇总 | 监测仪 × 年 | 否 |
annual_aqi_by_county_ |
年 AQI | 县 × 年 | 否 |
annual_aqi_by_cbsa_ |
年 AQI | 都市区 × 年 | 否 |
blanks_all_ |
空白样品 | 样品 × 时点 | 否 |
年份边界按层级不同,这是选文件时最容易踩空的地方。逐小时层级的臭氧文件可回溯到 1980 年,颗粒物各类文件最早到 1988 至 1991 年间,且 1999 年之前的 PM2.5 文件行数为零——文件存在但无数据,与文件不存在是两回事。日汇总与年度汇总可以回溯到 1980 年。空白样品文件最早到 1999 年。站点与监测仪描述是两个不带年份的独立文件,内容为累积登记状态。
附录 B:字段与主键
| 层级 | 主键 | 关键字段 |
|---|---|---|
| 站点 | 州码 + 县码 + 站号 | 经纬度、基准面、海拔、土地利用、设址类型、建立与关闭日期、所属机构 |
| 监测仪 | 站点键 + 参数码 + POC | 方法码、方法类型、所属网络、运行机构、开始与结束日期 |
| 逐小时 | 监测仪键 + 本地日期 + 本地时刻 | 测量值、单位、MDL、不确定度、限定符、GMT 日期与时刻、最后变更日期 |
| 日汇总 | 监测仪键 + 日期 + 样本时长 + 污染物标准 + 事件类型 | 观测数、观测百分比、算术均值、最大值与所在小时、AQI、方法码 |
| 年汇总 | 监测仪键 + 年 + 样本时长 + 污染物标准 + 事件类型 | 有效天数、应有天数、事件数据计数、超出标准次数、各百分位 |
附录 C:术语对照速查
| 缩写 | 全称 | 中文 |
|---|---|---|
| OAQPS | Office of Air Quality Planning and Standards | 空气质量规划与标准办公室 |
| CFR | Code of Federal Regulations | 联邦法规汇编 |
| CBSA | Core Based Statistical Area | 核心基础统计区(都市区) |
| AQI | Air Quality Index | 空气质量指数 |
| VOC | Volatile Organic Compounds | 挥发性有机物 |
| PQAO | Primary Quality Assurance Organization | 主质量保证机构 |
| PEP | Performance Evaluation Program | 绩效评价计划 |
| DAIMS | Datasheets for AI and Medical Datasets | 本文使用的数据集文档化框架 |
附录 D:常见误读速答
| 问题 | 一句话答案 |
|---|---|
| 有实时数据吗 | 没有,去 AirNow |
| 逐日更新吗 | 不是,一年两批 |
| 每个县都有值吗 | 没有,无站无值且不插值 |
| 1979 年以前能用吗 | 能,但不确定度更高,慎跨年代合并 |
| 参数有几百还是上千 | 单年少于七百,全历史逾千,登记口径更多 |
| 负数是脏数据吗 | 不是,很多参数允许负值 |
| 日汇总能直接求均值吗 | 不能,须先按事件类型与标准版本去重 |
| 能商用吗 | 能,无版权 |
附录 E:引用与再分发
推荐引用格式为:U.S. Environmental Protection Agency, Air Quality System (AQS), 取数日期,数据批次。
再分发时有三条建议:保留原始文件名中的年份与参数码,不要改写;附带取数日期与批次,否则他人无法复现;不要对数值做未注明的单位换算,库内已统一为标准单位。
若二次发布的是聚合结果,建议同时给出聚合规则(站点平均方式、完整度门槛、是否含事件),这三项决定了结果能否被他人重现。
编辑说明
核验时点:2026-10-29。规模、时间与结构三类数字均回读官方页面。
核验方式:站点与监测仪行数、文件批次日与各层级最早年份取自预生成文件页(页面自述最后刷新 2026-06-25);30 亿量级、1957 年起、1980 与 1999 两个分界、1,177 个参数、样本时长分布、75% 完整度、日汇总十二条记录等口径取自官方 AQS Primer;字段名与列序取自官方文件格式文档 v3.0.0;API 可用性与参数总数(1,380)于 2026-10-28 用官方测试账号调用接口取得返回。
双口径并存项:批次日官方有两处表述,文件页写六月与十二月前后,Primer 写名义上的五月与十一月;正文并列,不做统一。参数数量有"单年少于 700""全历史 1,177""接口登记 1,380"三个口径,全部列出并标明来源,不合并。
未覆盖内容:各年度的站点数与监测仪数未逐年抓取,正文不给逐年序列;文件总体积官方未汇总公布,本文不给估算;质控七类服务的具体数据未逐项读取;与健康数据对齐的效果无库内外部验证支撑,正文只给方向不给性能。
体例说明:本页按 v5 体例撰写,§1 至 §10 连续,附录 A 至 E 收拢事实清单,术语与口径集中在术语表与附录 C。全部外部链接置于结构化数据的 sameAs 与正文,站内互链按记录号指向对应页面。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- gbd-results — 共享标签:公共卫生与流行病学 / 疾病监测 / 公共卫生统计
- who-sti-prevalence-atlas — 共享标签:公共卫生与流行病学 / 疾病监测 / 公共卫生统计
- who-mortality-db — 共享标签:公共卫生与流行病学 / 疾病监测 / 公共卫生统计
- fair-health-atlas — 共享标签:公共卫生与流行病学 / 疾病监测 / 公共卫生统计
- wuenic-immunization — 共享标签:公共卫生与流行病学 / 疾病监测 / 公共卫生统计
- ndbc-buoy — 共享标签:公共卫生与流行病学 / 疾病监测
- noaa-cors-gnss — 共享标签:公共卫生与流行病学 / 疾病监测
- brfss — 共享标签:公共卫生与流行病学 / 公共卫生统计
- mics — 共享标签:公共卫生与流行病学 / 疾病监测
- ncd-risc — 共享标签:公共卫生与流行病学 / 疾病监测
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

