这套“1901-2024年我国省市县三级逐年平均气温数据(Shp/Excel格式)”,我最近刚刚完整跑过一遍筛选、统计、出图的全流程,顺手把经验整理出来。它本质是一套覆盖124个年份、精确到县域行政边界的逐年平均气温格点统计结果,同时提供两种格式:Shp为GIS专用矢量边界+属性的组合包,Excel则是给数据分析师用的轻量表格。适合GIS开发、城市规划、农业区划、气候风险和教学演示等场景,不管是想画一张“某年某县多少度”的专题图,还是想算“过去100多年哪些地方升温最快”,这套数据都能直接上手。
1. 数据资源拆解:年份长、尺度细、格式双轨
1.1 两种格式各解决什么问题
很多人第一次拿到这套数据会懵:同一个内容,为什么又是Shp又是Excel?我的理解很简单,Shp是用来“看空间关系”的,Excel是用来“算数值规律”的。
Shp格式是矢量面数据,每个行政单元(省、市、县)对应一个带边界的几何要素,属性表里存着气象字段。你可以把它直接拖进ArcGIS、QGIS、GeoDa等软件,按年份字段做分级配色,或者把多个年份的字段做差值对比。它的优势是“看得见边界”,一张县级温度图拉出来,整个区域的冷暖分布一目了然。设计上通常会用一个面要素代表行政区的几何,要么是“一个县一个面,属性表里有多年的温度列”,要么是“每一年一个面,文件名单独标记年份”,两种组织方式我都在处理中遇到过,建议先打开属性表确认字段结构。
Excel格式则是典型的表格型数据,行是行政区,列是年份或温度值,适合用透视表、函数、图表做统计分析和画趋势线。如果你只会用Excel,不碰GIS,也能完成大部分省级、市级的汇总计算。最理想的工作流是:Excel里做完清洗、筛选、汇总,把结果再通过唯一代码连回到Shp上出图。
1.2 这套长序列气温数据的“前世今生”
数据时间跨度从1901到2024,整整124年,这对国内大部分城市站点观测记录来说已经远远超过其建站历史。为什么能做到这么长?我理解这类产品多数是基于全球再分析资料或长时间序列插值生成的高分辨率栅格气温数据,再通过“分区统计”的方式落到县级行政区,得到每个县域的年平均气温。所谓“分区统计”,就是把栅格像元的值按行政边界范围内做算术平均,这样每个县最终只有一个有代表性的年均温数值。
当年做类似项目的时候,我有一段时间被“站点数据到底存不存在空间代表性”这个问题卡住。后来想通了:站点是点,行政区域是面,面内可能会跨越山地、谷地、水体,直接拿站点插值会造成偏差。而这套数据因为已经做了空间化处理,使用起来反而更省心。需要注意的是,它反映的是区域宏观气候背景,不能替代某个县气象站的精确实测记录,做趋势分析、相对排序、区域对比完全够用,但如果你想要某一天、某一个点的精确极值,那得另找原始站点数据。
1.3 时间广度和行政尺度带来的想象空间
时间连续性是这套数据最值钱的地方。124年意味着可以做年际变化趋势、滑动平均、突变检验、回归模型,甚至可以切出30年气候标准期做对比。行政尺度上,省、市、县三级足以支持“从宏观到微观”的递进分析。比如省级层面看全国升温格局,市级层面看某个地区气候带的移动,县级层面看具体县域农业热量资源的变化。
我做过一个很直观的实验:把2000年、2010年、2020年三个年份的县级年均温分别做成专题图,按温度重分类,然后叠加在一起看那条“暖线”往哪个方向移动。这种操作如果只用Excel表格,很难产生视觉冲击,而用Shp做分层设色,地域变化一眼就能看出来。所以从价值取向上,这套数据不是单纯的数据包,而是一把打开“气候变化与地理空间”交叉分析的钥匙。
2. Shp格式实操:从加载到出图的完整路径
2.1 Shp比栅格更好用的三个理由
拿到Shp,最常见的问题就是“为什么不直接给我TIF栅格”。因为对于“省市县三级”这种行政统计单元,矢量面有不可替代的优势。第一,行政边界精确。栅格是按规则网格划分的,落在边界上的像元像素会“跨界”,导致面积统计不准;矢量面则严格贴合行政区划,统计结果直接对应到县界。第二,属性表天然支持外部连接。你可以把Excel数据根据县代码连接进Shp属性表,不需要做任何栅格重采样。第三,制图表达灵活。符号化时按分类字段设置颜色,还能调整透明度、边框、标注,这些栅格都做不到这么顺滑。
2.2 在ArcGIS里五步画出一张县级年均温专题图
我习惯用ArcGIS做这种矢量出图,QGIS操作也类似,但ArcGIS的制图布局更顺手。具体流程如下:
- 打开ArcMap或ArcGIS Pro,把下载好的Shp包解压,确保
.shp、.shx、.dbf、.prj四个文件在同一个文件夹里,不要只拖入.shp。 - 在图层面板右键图层,打开属性表,先看字段结构,确认是否存在某个年份字段(比如“temp_2020”),或者是否已经包含年份行。如果只有一个“平均气温”字段,那通常一个年份就是一个单独的数据面。
- 右键图层,选择“符号系统”,选择“数量分级色彩”,字段选目标年份。分类方法建议先用“手动”设置为4到6类,让图例清晰而不是自动分得很碎。
- 在布局视图插入图例、比例尺、指北针,再添加标题。出图之前一定要检查图层坐标系,如果底图是WGS84或CGCS2000,保持一致,否则会出现边界漂移。
- 如果要出多年份对比图,可以通过“创建渔网”或者复制图层来分开符号化,更规范的做法是用“按属性选择”或定义查询来控制显示年份。
这个过程最花费时间的是“字段名对应的年份不直观”。有些产品年份字段会命名为Y1901、Y2020,或者用短名T_2020,我建议拿到数据后务必写一个字段对应表,否则引用字段容易出错。我在某个项目中吃过没查字段的亏,把一个“基准期”字段当成“当前期”做了图,算出来的增量完全反了,后来花了一下午才检查出来。
2.3 批量出图时如何把Excel统计表“塞进”布局里
这个需求其实很常见:在GIS地图旁边放一个小的Excel统计表,比如“各省升温幅度Top5”。很多人发现ArcGIS布局里无法直接嵌入活页面表,只能截图或导出图片再放进来,但这样更新数据后图片不会联动。
我的处理办法有两种:
一种是利用ArcGIS的“报表”功能,先根据需要生成统计报表,再以对象的形式插入到布局中,这样可以随数据源刷新,缺点是需要花时间设置报表的边框和字体。
另一种更常用:导出Excel为高分辨率PNG,用“布局”窗口里“插入图片”功能放置到图框旁边。为了保证图片透明背景,制表时不要填充底色,这样插入后和地图排版融合得更自然。如果追求更高级的效果,可以做一个“数据框”嵌套:在布局里再插入一个小数据框,数据框显示长条图或者柱状图,然后导入Excel对应数据。总之,“批量出图”的规模越大,越要把统计表、图例、标题做成模板,一次设置,后续自动套用。
2.4 Shp格式转换:从dwg、txt、3dtiles到GeoJSON
热词中有人搜“dwg转shp”,也有人搜“shp转3dtiles”。对于前者,通常是CAD设计图里要带出行政区线或地块属性,转Shp时最要紧的是坐标系匹配,建议在ArcGIS中使用“CAD至地理数据库”工具,避免直接拖拽DWG后坐标系混乱。对于后者,如果想做三维可视化,把二维Shp转成3D Tiles,可用CesiumLab、ArcGIS Pro的“创建3D切片”或QGIS插件,需要先根据“县面”做拉伸高度场,再叠加温度属性。如果是简单的临时转换,我会用QGIS“仅导出要素另存为”直接存GeoJSON,或使用ogr2ogr命令行,比如:
ogr2ogr -f GeoJSON output.json input.shp -t_srs EPSG:4326这种灵活度是ArcGIS菜单操作给不了的。不过我的原则是:能用专用工具做完整工作的,不要随便转格式。3D切片需要的LOD、属性索引很讲究,一看上去“转换成功”不代表“渲染正确”,建议转完以后在浏览器里检查瓦片层级和属性挂接。
3. Excel格式实战:清洗、统计、趋势一锅端
3.1 拿到Excel表后的第一件事:不要急着算平均
大多数分享这套数据的Excel表,列结构可能是“省、市、县、代码、1901、1902、……、2024”,也有可能是“行政区、年份、平均气温”的长表模式。宽表适合人看,长表适合机器算。我拿到后第一件事就是先分列、再统一格式。
常见问题有三个:一是“年份列”被识别成文本,这是Excel自动处理中文表格的顽疾,尤其是从CSV转过来的数据,年份列左侧会有一个绿色三角,用AVERAGEIF会直接出错,需要选中列后点击“转换为数字”或分列直接转。二是气温值可能存在负值,尤其是北方冬半年,按区域选中以后,在格式设置里不要简单设置成“0.0”就完事,还得设置“-0.5”的负号显示。三是有缺失值。有些年份可能因为没有观测或插值失败,在单元格里显示#N/A或空白。我用筛选功能把空值标记清楚,再用插值补全或直接剔除,千万不能让空值参与SUMIFS计算。
3.2 三组Excel公式,轻松做气候趋势分析
如果你的需求只是“计算某省某市近30年的平均气温变化”,通常不需要去写复杂代码,Excel函数完全够用。
AVERAGEIF用于按区域求均值。比如表格是宽表,你想算河北省所有县域2020年的平均温度,先建一个辅助列,用省份字段作为条件区域,再指定平均区域。注意条件写“河北”,如果存在“河北省”这种带“省”字的后缀,得用通配符*河北*。SUMIFS用于多条件求和,比如要统计“东北地区+2020年以后+年均温大于10度”的县域累计值,可以把地区、年份、数值三个条件同时放进去。这里必须保证年份字段是数字,否则条件判断会失败。SUMPRODUCT用于更复杂的统计,比如“两个条件下数量占比”。我用它做过一个“有多少县近20年年均温超过历史平均”的快速判断,公式短且高效。
热词里有人搜“同一列中统计含关键词对应数据求和”,这个场景就是在区域内筛选后再汇总。我推荐用辅助列配合ISNUMBER(SEARCH("关键词",A2)),生成0或1的布尔值,然后再用SUMIF或SUMPRODUCT。比直接在一列上做嵌套判断要简单得多,还能随时保留中间结果。
3.3 用数据透视表快速汇总到省、市两级
县域数据动辄几千条,直接看原始表根本看不出格局。我会在额定好的字段基础上插入数据透视表,行区域放“省”,列区域放“年份”,值区域放“平均气温(均值)”。这样一下就能生成一张“省×年”的透视矩阵。再配合折线图,就能看到各省升温曲线的斜率差异。
注意透视表默认汇总方式是“求和”,在值字段设置里一定要改成“平均值”。另外宽表结构直接把“1901、1902……”都拖到列区域,会产生极宽的透视结果,不适合做图。我会用Power Query把宽表逆透视(Unpivot)成长表,再做透视表。具体操作:数据→获取数据→从表格/区域→选择所有年份列→逆透视列。这样生成的“属性”和“值”两列,再做透视和画折线图都轻松很多。热词里的“excel处理框架”“excel做z-score标准化”,本质也是先逆透视,然后标准化。Z-score标准化在Excel里可以用公式=(实际值-平均值)/标准差,没有直接函数,我习惯先拖一个透视表求基期均值和标准差,再用公式引用。
3.4 Python读写Excel,给效率再加一个档
如果你是经常处理成百上千个县域数据的人,我强烈建议绕开鼠标操作,用Python的pandas加openpyxl。比如:
import pandas as pd df = pd.read_excel("气温数据.xlsx", sheet_name="县域表") # 筛选河北省 hebei = df[df["省"].str.contains("河北")] # 按市分组求十年均值 result = hebei.groupby("市")[["2011","2020"]].mean() # 写回Excel result.to_excel("河北分市十年均值.xlsx")这套流程对“python写入excel”“python查找excel中字符串”“excel写uuid”这些关键词也很应景。查找字符串用df[df["列名"].str.contains("某某")],写UUID直接用df["uuid"] = [str(uuid.uuid4()) for _ in range(len(df))],再to_excel保存。我一直觉得“处理框架”不是某个固定模板,而是“先清洗、再聚合、最后可视化的顺序感”,Python能让这种顺序感变成可复现的脚本,这是传统Excel操作给不了的。
4. 把Excel结果挂到Shp上:关键一步和全套实操
4.1 行政区划代码是这个流程的“身份证号”
在Excel和Shp之间做连接,最关键的不是县名,而是县的行政区划代码。县名“张家口市”和“张家口市宣化区”在单纯字符串匹配上很容易出错,一个带市、一个带区,甚至同一名称在不同历史时期归属调整过。我的习惯是:Excel里保留完整县级代码(6位数字),Shp的属性表里也必须有对应的代码字段。ArcGIS连接时,用代码字段作为连接键,不要用名称。
如果发现两边代码类型不一致,用Excel把代码列统一设置为文本,或者在ArcGIS里用“添加字段”+“字段计算器”补一个相同类型的新字段。这种事听起来简单,实际做的时候经常遇到“一个开着,一个没开”,导致连接结果全为空。我的排查方式是在连接前先做两个字段的双向计数,确保有交集。
4.2 标准连接流程:从Excel到临时图层再到永久图层
以ArcGIS为例,操作如下:
- 打开Shp图层的属性表,确认好代码字段名(如
XZQ_DM)。 - 在菜单栏选择“连接和关联→连接”,指定将要连接的Excel表“sheet$”。
- 连接字段分别选Shp的
XZQ_DM和Excel表里的县代码。 - 确认连接后,图层属性表会多出Excel中的所有字段,这个时候先不要直接保存,而是用“数据导出→导出要素”另存为新Shp,这样Excel字段会永久写入新Shp的dbf属性表里。
- 完成后检查几个抽样县的数值正确性。
如果你用的是QGIS,类似操作是右键图层“连接属性表”,最终也要“导出另存为”来固化连接。不要直接在原Shp上保存连接,因为连接关系只在当前工程内有效,换台电脑或换份Excel就失效了。
4.3 做一个“温差对比图”:计算差值并分级着色
假设你想比较“2010年代”和“2000年代”两个十年的平均温度差值。先Excel里算出每个县的差值(新列),再挂接到Shp,之后做差值分级设色。我会选择“红蓝”色带,负差值用蓝色,正差值用红色,每个级别设为0.5度,这样能直观看到哪些区域变暖快。
制做完以后加布局、出图。批量出图时,我用“定义查询”为每个年份“复制一份相同图层再筛选”,但更现代的选择是使用ArcGIS Pro的“对图层启用时间属性”,支持时间滑块逐帧播放。这种方法比一帧帧导出PNG更生动,做汇报演示效果极佳。
4.4 如果只想快速出图不想学GIS
有相当一部分人其实只需要“某年某省温度地图”做PPT插图,不必在GIS里深度操作。我有两个偷懒方案:
一是在QGIS里加载底图和Shp后,点击“布局管理器”创建单一布局,把“WSI地图”和“图例”都拖进去,导出PNG,设置300DPI,整个过程不到五分钟。二是直接使用在线平台(比如DataV、地图慧),上传带有“行政区、数值”的Excel,平台自动匹配到地图。这类平台可以秒出图,但需要注意上传的行政区名称必须与平台库的标准名称一致,否则匹配失败。个人经验:正式论文和报告我宁可用GIS,因为在线平台的边界精度和配色可控性都有限。
5. 常见问题与排查技巧实录
5.1 Excel加载项被禁用、Ctrl+V失效,先别砸电脑
做气候分析时经常同时开着几个Excel工作簿,外加Python脚本,很容易出现“Excel加载项被禁用”或者“Ctrl+V粘贴无反应”。根据我踩过的坑,优先级排查顺序如下:
- “Ctrl+V”失效时先看键盘是否锁了粘贴板,Win+V调出系统剪贴板历史,看里面有没有内容。如果有但粘贴仍是灰色,通常意味着Excel在处理大型数组公式,会暂时锁住剪贴板。
- 进入“文件→选项→加载项”,查看“COM加载项”,重点检查Python插件、智译、慧办公等第三方加载项,逐个禁用后重启Excel。见过一个用户的Excel被一个pdf转换插件弄得公式下拉全失效,禁用后恢复。
- 宏安全等级如果不是“禁用所有宏且不通知”,也有概率导致粘贴操作被干扰,把宏安全调整为“启用所有宏”再试,但注意不要在联网环境乱开。
表格环境稳定是数据处理的地基,地基不稳,后面所有公式、透视表的结果都不可信。所以我遇到“加载项被禁用”这种提示,反而觉得是系统在提醒你:别开那么多杂七杂八的功能。
5.2 Shp属性表中文乱码和数据对不上
在ArcMap打开一些老Shp,属性表的“县名”会显示成乱码,原因通常是dbf编码用的GBK,而ArcMap默认按UTF-8解析。解决办法有几种:
- 在ArcMap旁边放一个
.cpg文件,文件内容写入GBK,重新加载图层,就能让软件按GBK解码。 - QGIS里加载时选择“图层编码”为
GBK或UTF-8,试到正常为止。 - 还有一种救命稻草,用DBase转换工具先把dbf导出为CSV,再用记事本打开改编码,最后另存为UTF-8导入。
乱码和数据对不上往往同时发生。比如连接后很多县的数值变成了NULL,先检查连接码是否匹配,再检查编码是否正常。如果两个县代码前面有隐藏空格,用Excel的TRIM函数清掉。
5.3 行政区划边界变化导致的年份不可比性
1901年至今,政区边界调整频繁,尤其是县级,很多县的代码或名称都发生了改变。用同一套Shp去匹配不同年代的Excel数据,必然会出现“某些年份没有这个县”或“某县位置不等于老县位置”的问题。我的处理原则是:
- 优先使用当前标准行政区划边界,因为它最稳定也最容易获得“县域行政区划边界 shp”。
- 对于历史上已合并或撤销的县,按照行政变更表做归并,保证每一年的统计口径一致。
- 如果做时序分析,务必记录“口径调整版本”,在报告里说明“基于2020年标准县域边界”。否则明年你自己看自己的图都搞不清楚。
这个坑很隐蔽,也是最容易让结果被质疑的地方。所以我每次分析都会在数据备注里写明“边界基准年”。
5.4 云盘下载的Shp打不开或缺失投影
不少用户为了图方便,从网盘下载别人分享的Shp压缩包,结果解压后发现少了.prj文件,画图时总提示“未知空间参考”。没有投影文件,ArcGIS虽然能用,但叠加到正确坐标系的地图上会跑偏。
我的建议是:用QGIS重新指定投影。右键图层,“设置图层CRS”,选择一个常用投影,比如CGCS2000EPSG:4490或者WGS84EPSG:4326。如果不知道原始投影,可以试着从相邻文件的prj复制,或咨询数据来源方。还有一个细节:Shapefile是多个文件成套存在的,只拷贝.shp而不拷.dbf,属性表就是空的;只拷.shx,连图形都可能打不开。所以网盘下载完,第一件事先检查文件是否齐全。
5.5 批量出图时想插入Excel表格但插不进去
前面提到了嵌入统计图片的两种方式,这里补充一个我踩过坑的细节:如果直接在ArcGIS布局里插入Excel对象,部分版本会出现“OLE对象无法创建”或“文件占用”的报错,原因是Excel文件正被打开,进程锁定了。要么先把Excel关掉,再插入;要么把Excel区域复制后,用“选择性粘贴→图片”贴成PNG。图片方式虽然牺牲了动态联动,但胜在不会崩。做几百张批量图时,我都是把统计表格导出为固定尺寸PNG,然后用一条Python脚本批量贴到模板图的指定坐标里,速度很快。
6. 数据还能这样玩:从静态表格到决策辅助
6.1 叠加人口密度,看“高温影响人口”到底有多少
县均温数据单看并不性感,但它一旦和人口栅格、GDP数据叠加,就会变成一张“脆弱性画像”。以前我做过一次实验:从世界人口网格中按县域边界聚合出各县人口,再把2020年气温按三分法分成低、中、高,然后用交叉表统计“高气温+高人口”县域数量。这种分析能帮你快速圈定哪些区域需要优先关注高温影响,从数据到决策的逻辑一下就成立了。
6.2 结合降水数据做“暖干化”区划
如果你手头还有同源的降水数据,可以计算“干燥度 = 年潜在蒸散 / 降水”,再把温度数据拉进来,构建二维聚类。比如县域可以分成“暖湿型、暖干型、冷湿型、冷干型”,用Excel散点图加标签就能可视化。这种分类比单纯看温度趋势更实用,因为农业、林业决策都需要同时考虑温度和水分两个驱动。此次“110年来年温差”的排序还能辅助识别那些“变暖但没变干”的县域,它们往往是灌溉农业需要重点关注的地区。
6.3 制作县域温度演变动态GIF
用QGIS的“时间管理器”插件或ArcGIS Pro时间滑块,把124年逐年温度加载进去,按年播放,每帧导出截图,再用ImageMagick合成GIF。这个动图放在PPT里非常有说服力,观众能看到暖色区域从零星点状扩展成连片面的过程。如果嫌导出麻烦,也可以直接用matplotlib读取Excel后生成动画,虽然少了地理边界,但胜在高效。
6.4 把Shp转成GeoJSON发布到Web地图
最后补充一个轻量级发布技巧。完成县级逐年气温表后,如果想做个网页版交互地图,最省事的路径是:用QGIS打开Shp,右键导出另存为GeoJSON,接着配合MapLibre或Leaflet就能加载。如果你对服务有更高要求,可以用tippecanoe把县级GeoJSON直接切片成.mbtiles,再通过服务软件发布,性能远好于直接请求大体积GeoJSON。这里的数据字段建议只保留“县代码、县名、某年年均温”,做前清一下字段能显著减小文件体积。
说到底,数据本身是一套工具,工具的价值取决于使用者的思路。再强调一下我个人的习惯:每次拿到新数据,先花十分钟摸清结构、边界、代码,再动手算数。这套“1901-2024年我国省市县三级逐年平均气温数据(Shp/Excel格式)”就是一个典型样本,能让你体会一次“从Excel的格子到地图上的色块”的完整旅程。一旦这条路走通了,以后再遇到任何带空间属性的统计表,你都能敏锐地判断出:这数据怎么整理、怎么挂接、怎么出图,整条链路自然就顺了。