尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

全国空气质量监测数据2014-2025:Excel与Shp空间分析完全指南

全国空气质量监测数据2014-2025:Excel与Shp空间分析完全指南 2014到2025年这十一年恰好是国内空气质量监测网络从“稀疏布点”走向“精细化管理”的关键阶段。我整理这份全国监测站点逐日空气质量数据时最直观的感受就是它记录的不仅仅是PM2.5、PM10这些数字的起伏更是一份能直接用于科研建模、城市规划、健康暴露评估甚至商业选址判断的硬核基础资料。整个数据集覆盖2014年1月到2025年间全国数千个国控、省控及部分地方站点的逐日监测记录包含15项核心指标并且同时提供Excel表格和Shp矢量文件两种格式前者方便做统计分析后者能直接进GIS做空间制图。这篇内容不是简单丢个下载链接就完事我会把数据集的字段设计、Excel处理时的坑、Shp文件在ArcGIS/QGIS里的正确打开方式以及我实际分析时踩过的坑和总结的排查技巧一并梳理出来。如果你正准备拿这类数据做毕业论文、出咨询报告或者单纯想做一张“全国空气质量十年变化图”这篇内容应该能帮你省下不少摸索时间。1. 拆开看看这套空气质量数据的目录结构与核心字段拿到数据包第一件事别急着双击打开先看目录。这套资料按“年度站点指标”的逻辑组织Excel文件夹下通常按年份拆分为多个工作簿每个工作簿内以站点ID命名工作表或直接堆叠成一张总表Shp文件夹则按站点分布、行政区划边界、监测点位属性三类文件区分。这种组织方式的好处在于做时间序列分析时可以直接按年份切片做空间分析时又能快速关联属性表不会出现“一张表塞了十年数据导致Excel卡死”的尴尬。1.1 十五个监测指标逐个理清楚标题说的15个指标实际对应的是环境空气质量标准里的常规污染物和气象辅助参数。我拆开看过基本覆盖了SO₂、NO₂、PM10、PM2.5、CO、O₃这六项国控必测污染物以及它们的24小时滑动均值、最大8小时均值、AQI指数、首要污染物、空气质量等级等衍生字段。这里有个容易混淆的点AQI和污染物浓度是两套逻辑AQI是归一化后的综合指数而原始浓度单位是μg/m³CO是mg/m³做回归分析或机器学习特征工程时务必区分清楚否则量纲不一致会直接带偏模型。还有几个字段值得单独说O₃的“日最大8小时滑动平均”是个典型陷阱很多初学者直接拿日均值替代但这会导致夏季臭氧污染被严重低估CO的24小时均值虽然单位不同但在计算燃烧源贡献时是关键变量首要污染物字段则是文本型数据在Excel里做COUNTIF统计时别忘了处理空值和“无”这类特殊标记。如果你拿到的是分年Excel建议先合并成一张总表再统一处理字段类型而不是逐年清洗否则后期拼接时会遇到格式不一致的麻烦。1.2 Excel文件的组织方式与时间跨度说明从2014年到2025年逐日数据意味着每个站点每年约365条记录全国上千个站点累计就是百万级行数。Excel 2003的65536行上限肯定装不下所以这套数据用的是.xlsx格式单表容量约104万行刚好够用。但即便这样把十年全部站点塞进一张Sheet仍会卡顿因此原数据按“年季度”或“年站点分组”拆分是更合理的选择。这里有个实操建议如果想把所有年份合并成一张总表用Excel自带的Power Query会比VBA更稳。Power Query可以直接从文件夹批量导入所有工作簿自动识别列名并追加合并全程不用写代码。步骤是数据选项卡→获取数据→来自文件→从文件夹→选择数据目录→预览并转换→关闭并上载。千万注意合并前先检查各年表的列名是否完全一致有的年份可能多了“数据状态”或“审核标记”列这些不一致列会导致合并后数据错位。2. Excel端的清洗与分析操作指南Excel是处理这套数据最轻量的工具但它对百万行数据的操作逻辑和普通表格完全不一样。很多人问“为什么我打开文件就卡死”“筛选一下就无响应”大概率是你忘了关闭自动计算和启用手动计算模式。公式选项卡→计算选项→手动这一步能让你在筛选、排序时节省大量等待时间。另外数据区域千万别用整列引用比如A:A这种百万行规模下整列运算会直接把内存吃满。2.1 用Excel做多表合并的关键步骤跨年数据合并我推荐两种路径。第一种是Power Query合并适合批量操作第二种是VLOOKUP或XLOOKUP关联适合小规模匹配。以“把2024年站点属性表匹配到2023年监测数据”为例公式可以写成XLOOKUP(A2,属性表[站点编号],属性表[经度],“未匹配”)。这里有个细节XLOOKUP的第四参数必须写否则匹配不到时会返回#N/A后续透视表会把这些错误值当计数项严重影响统计结果。再一个高频需求是日期的标准化。原始数据里日期格式可能存在“2024/1/5”“2024-01-05”“20240105”三种写法统一用TEXT函数或分列功能处理。我习惯用分列数据→分列→固定宽度或分隔符号→日期(YMD)这样能避免TEXT函数把日期转成文本后无法参与时间序列计算。做完这一步最好再用WEEKNUM函数加一列“周序号”方便做周维度聚合。2.2 常用函数处理空气质量数据的实战示例以计算“某城市全年PM2.5达标天数比例”为例标准限值是日均75μg/m³公式可以这样写SUMPRODUCT((PM2.5列75)*1)/COUNT(PM2.5列)。SUMPRODUCT在这里充当了条件计数和总计数器的双重角色计算结果按百分比格式显示就是达标率。如果涉及多站点、多城市嵌套统计透视表反而更直观把“城市”放行标签“日期”放列标签“PM2.5”放值字段并设置为平均值然后加一个“0-35、35-75、75以上”的分组字段一秒看出污染级别分布。还有一个很多人踩坑的场景SUMIFS和AVERAGEIFS处理多条件统计时条件区域和求和区域必须行数完全一致否则返回#VALUE!。而且条件文本匹配是精确匹配如果站点名称里有空格或全角字符条件写“北京”就永远匹配不上“北京东城”。解决方案是提前用TRIM和SUBSTITUTE函数清洗站点名字段。3. Shp格式的空间分析从坐标到出图Part 2的Excel处理只是前菜这套数据真正的价值在Shp文件上。Shp格式虽然名字叫“文件”实际上是一组文件的集合至少包含.shp几何、.shx索引、.dbf属性三个基础文件缺任何一个都打不开。很多新手只拷贝了.shp单文件就发给别人结果对方报错“无法打开”就是这个原因。另外.prj文件定义了坐标系这套数据的站点坐标通常是WGS84地理坐标系GPS坐标系经纬度单位是度如果你要算距离或面积必须投影到Albers等面积投影或UTM投影否则结果会偏得离谱。3.1 站点Shp叠加行政区划的操作要点拿到站点Shp后的第一个常规操作是把站点落到行政区划图上判断每个站点属于哪个省市。ArcGIS里可以用“空间连接Spatial Join”工具目标要素选站点点层连接要素选行政区划面层匹配选项选“INTERSECT”这样每个站点会自动附上所属省份、城市、区县名称。QGIS里对应的是“按位置连接属性”工具操作路径矢量→数据管理工具→按位置连接属性。这里有个特别需要注意的坑坐标系不一致导致的偏移。如果行政区划用的是CGCS2000投影坐标而站点Shp是WGS84地理坐标直接叠加会看到站点跑到海里或国界外。解决方法是先用“投影”工具把站点层转换到行政区划的坐标系而不是直接用“定义投影”乱改。记住定义投影是声明坐标系的正确性投影转换才是改变坐标系这两个工具经常被搞混。3.2 用ArcGIS/QGIS做年均浓度空间插值空间插值是空气质量数据可视化的常用手段目的是根据离散站点的浓度值推算出连续表面。操作方法有两种反距离权重法IDW和克里金法Kriging。IDW适合快速出图参数少、计算量小在ArcGIS的Spatial Analyst工具箱里选“插值分析→反距离权重法”功率默认2即可克里金法更适合做科研它能给出预测误差表面但需要先做半变异函数拟合对新手不太友好。我建议的做法是先用IDW出草稿图判断站点密度如果站点分布太稀疏比如某省只有两三个站点插值结果的可信度会很低这时候应该用“趋势面分析”或“样条函数”辅助验证别直接拿一张看似平滑的图当结论。另外出图前的分级渲染也很关键建议用分位数分类而不是等间距分类因为PM2.5浓度分布通常是偏态的等间距会把大部分区域压到低值区视觉上分不出差异。4. 我踩过的坑与排查技巧实录这套数据我前后处理过三个版本踩过的坑比看过的教程都多。以下问题是高频出现的我按场景整理成速查表方便你对照排查。4.1 Excel读取与格式兼容性问题最经典的问题就是ArcGIS连接Excel表格时报错“连接到数据库失败。常规功能故障外部表不是预期的格式”。这个报错90%是因为Excel文件不是真正的.xlsx而是网页另存或WPS生成的伪Excel或者表头有合并单元格。解决办法打开Excel另存为“Excel工作簿(*.xlsx)”确保第一行是纯字段名不要有标题行删除所有合并单元格然后重新在ArcGIS里添加数据。另一个高频问题是用Excel打开Shp的.dbf属性表发现中文站点名变成了乱码。这是因为.dbf文件的编码不是UTF-8而是GBK或ANSI。ArcGIS里可以通过“表选项→导出”时选择编码QGIS则可以在图层属性→数据源→编码里切换为GBK。如果已经乱码了就用Notepad打开.dbf用插件Hex Editor查看字段编码但这方法不推荐太麻烦。我建议直接用QGIS打开后另存为GeoJSON再导入Excel处理属性编码问题一劳永逸。4.2 Shp与Excel联合查询时的坐标匹配错误用ArcGIS连接Excel里的站点坐标时经常遇到“点全部跑到非洲”的情况。这通常是因为Excel里的经纬度字段被当成了文本或者经纬度写反了。我的排查步骤第一步确认Excel中经度X在前纬度Y在后别写成“Y,X”第二步在ArcGIS添加XY数据时X字段选经度Y字段选纬度坐标系选WGS84第三步如果图层还是跑偏用“筛选”看字段值是否包含中文逗号或全角字符比如“121.4731.23”这种会导致数值无法解析。清洗方法用Excel的SUBSTITUTE函数把全角逗号替换成半角逗号然后分列。还有一个真实案例有人把站点经纬度与行政区划Shp做了空间连接结果发现“上海”的站点跑到了“江苏”的区划里。原因是边界两侧的站点本身就极近而空间连接默认选“最近”匹配这时应该改用“INTERSECT”相交选项并为被多个区划包围的站点添加“距离容差”参数把容差设为站点距边界平均距离的1.5倍能有效减少误判。5. 这套数据还能怎么用扩展场景与课题方向参考除了在学校或报告里画污染趋势图这套十年逐日数据能做的事情远超你想象。我列几个我实际跟进过的方向供你参考。5.1 结合气象与人口数据做多维分析把逐日空气质量数据与气象站点的气温、湿度、风速数据做时间匹配可以分析气象条件对污染浓度的贡献。比如利用Python的Pandas库做merge操作key是站点ID日期就能把一个城市的气象、污染数据对齐到一张表。在此基础上做相关性分析你会发现PM2.5与风速显著负相关与湿度正相关而O₃与温度显著正相关——这些结论都能写进对策建议里。再进一步接入人口密度或土地利用数据比如夜间灯光数据就能做健康暴露评估估算“多少人生活在PM2.5超标区域”。这类分析需要网格化处理把每个站点浓度插值到1km×1km的网格然后与人口栅格叠加计算加权暴露浓度。说实话这套数据的站点密度在东部地区是够用的但在西部稀疏区插值误差会很大建议只做地级市尺度别做县级。5.2 用Python批量处理Excel与Shp的进阶流程如果你熟悉Python建议跳过Excel直接处理。核心流程分四步用Pandas的read_excel循环读取所有年份Excel并concat用GeoPandas读取站点Shp把经纬度转成Point几何对象用空间连接把站点归属到行政区划最后按“省份年份月份”分组聚合生成透视表。我给一段核心代码参考import pandas as pd import geopandas as gpd from shapely.geometry import Point # 读取所有年份Excel df_list [] for year in range(2014, 2026): df pd.read_excel(fair_{year}.xlsx, engineopenpyxl) df[year] year df_list.append(df) df_all pd.concat(df_list, ignore_indexTrue) # 构建GeoDataFrame gdf gpd.GeoDataFrame( df_all, geometry[Point(x, y) for x, y in zip(df_all[经度], df_all[纬度])], crsEPSG:4326 ) # 空间连接行政区划 city gpd.read_file(city_boundary.shp) merged gpd.sjoin(gdf, city, howleft, predicateintersects)这段代码跑完你会得到一张带省市区字段的百万行大表后续聚合、分析、画图都基于这张表。注意GeoPandas的空间连接在数据量大时很耗内存建议先按年份切片跑或者用PySpark做分布式处理。最后分享一点我的切身体会处理这类十年尺度的监测数据最忌讳的是拿到就急着算结论。我建议你花一周时间做数据质量审校先按站点维度统计每个指标的缺失率再按年维度看均值突变最后把可疑站点单独标记出来回查原始记录。这套数据里部分早期站点可能因为设备更换或校准问题出现过系统性偏差直接进入模型会埋雷。如果你愿意花点力气做这一步后面出的每一张图、每一个结论都会扎实很多。另外Shp文件在交付给非GIS同事时记得压缩成ZIP包并附带一份坐标系说明文档能省掉大量“为什么打不开”的沟通成本。
返回列表