☰
全国省市县三级逐日最低气温数据集:设计与应用指南
2026/10/9 6:55:06 网站建设 项目流程

做农险精算、能源负荷分析或者城市规划的朋友应该都有这种感受:真正要评估一次冷冬、一场冻害,或者推演采暖负荷的时候,需要的往往不是某年某月的平均气温,而是落到每一个省市县行政单元、每一自然日的最低气温。最近我整理完一套2005—2025年全国省市县三级的逐日最低气温数据,按Excel和Shp两种格式同时提供。这篇文章不打算只罗列"我有什么数据",而是想把数据结构怎么设计的、拿到手怎么处理、空间上怎么用、以及最容易忽略的几个边界问题一次讲透。无论你是刚接触这类数据的学生,还是已经在用ArcGIS、QGIS做日常分析的一线从业者,按自己的基础挑着看就行,我说的每一步都是实际跑过的。

1. 为什么我从海量气象原始记录里整理了这套逐日最低气温数据

1.1 先想清楚数据要服务哪些场景

先说结论:这套数据不是给气象台做预报用的,而是给"下游应用"做评估和决策用的。我在整理之前梳理过一遍实际需求,基本集中在四类场景上。

农业是最直接的。冬季越冬作物评估、果树冻害保险理赔、大棚低温预警,都需要知道某一档低温在某一个县持续了多少天。比如茶叶种植区最怕的是春季霜冻,光看日平均气温偏差很难判断,因为也许整体偏暖,但某一天凌晨的低温直接把新芽打掉了。逐日最低气温配合物候期窗口,才能真正落地。

能源行业也离不开最低气温。城市采暖负荷和室外日最低气温的相关系数非常高,尤其北方几个省份,一到寒潮过程负荷直接拉满。做负荷预测模型时,最低气温是比平均气温更敏感的输入变量。

建筑行业的需求更偏"设计重现期"。比如围护结构热工设计、采暖通风设计,本身就需要逐年逐日的极端低温序列,用来推算所谓"历年不保证日数"或"冷冬重现期"。没有连续多年的逐日最低气温,这些参数只能靠估算。

还有一类是低温天气指数保险。这几年各地推的"天气指数保险",理赔条件经常写"某县某日内最低气温低于-4℃触发赔付"。做这类产品必须用县级行政单元的逐日序列,而不是气象站单点数据。

1.2 最低气温这条指标的独特性

你可能想问:为什么非要最低气温,直接用平均气温不行吗?我的经验是,平均气温会把极端信息"稀释"掉。举个例子,某年冬天某县白天温度接近常年,但连续三个清晨最低气温跌破-10℃,对露天蔬菜、多年生果树来说,这三天就是致命的。平均气温序列里这三个异常点基本上看不出来,但逐日最低气温序列里,它们就是明显的谷值,是做极端事件分析和灾害评估时最有信息量的部分。

另外,从数据整理角度看,最低气温也比平均气温更容易做质控。气象站观测记录里,日最低气温出现的时间相对规律,通常在后半夜到清晨,受太阳辐射影响小,插值和订正的逻辑更清晰。所以这套数据在整理时我选择以最低气温为核心变量,而不是做一套"全要素"的大杂烩,保证每条记录的可靠性。

2005到2025年这个时间窗也很有意义。21年的时间跨度足够覆盖近两轮冷暖波动,既能支撑气候态统计(通常要求至少30年,但21年在很多工程初设估算里已经是可用序列),又能让"十年一遇"级别的极值推算有真实样本做校准,不会只依赖零散的多年平均值。

2. 数据格式与字段设计:Excel和Shp里分别装了什么

2.1 Excel文件的组织方式与字段约定

先说Excel。很多人拿到逐日数据的第一反应是"一天一行",这个直觉要分情况看。

全国县级一共2800多个县级行政单元,如果按"省—市—县—日期—最低气温"这种长表结构做,2005到2025年约7660天,总行数会突破2000万行。Excel单表上限是104万行,肯定装不下。所以我在整理时采用了分层文件结构:

  • 最常用的是省级和市级的长表:每个文件一行表示"某省(市)某日的最低气温",配合行政区划代码使用,Excel可以直接处理;
  • 县级数据按年份拆分文件,每年一个Excel工作簿,每个工作簿仍然是长表结构,单文件控制在一个县级行政单元数量乘以当年天数左右,大约一百万行上下,刚好压在Excel极限附近;
  • 同时提供一份"县级宽表版本":每行是一个县,每一列是某一天的最低气温,列名就是日期,方便做相关分析、求极值和绘制热力图。

字段设计上,我统一保留了这些列:

  • 行政区划代码:使用国标6位或12位代码,这是关联数据的唯一主键;
  • 省名、市名、县名:作为展示字段,方便肉眼识别;
  • 日期:统一为YYYY-MM-DD文本或日期格式;
  • 最低气温:统一单位摄氏度,保留一位小数;
  • 数据来源标识:区分站点观测直接值、插值订正值和推算值。

缺失值我约定用-9999标注,而不是留空。原因很简单:Excel的透视表和ArcGIS的属性表关联时,空值经常会参与计算或者被当作0处理,-9999至少在筛选的时候可以一眼识别。

2.2 Shp文件的边界底图与属性表设计

Shp格式是空间数据的老牌格式,一个完整的Shapefile由.shp(几何)、.shx(索引)、.dbf(属性)、.prj(投影信息)等文件构成。经常有人只拷贝了.shp就抱怨打开失败,其实缺一个都不行。我提供的Shp数据里,边界底图是按省、市、县三级分别输出的,坐标系统一使用CGCS2000或WGS84,方便和大多数公开数据叠加。

属性表设计上和Excel保持一致的原则:行政区划代码、省名、市名、县名作为基础字段,另外放入该行政单元的多年最低气温统计指标,比如历年最低气温、多年平均最低气温、极端低值出现日期等。逐日明细不放进Shp属性表,否则会变成7660多个字段,实际没法用。正确用法是把Shp当成"空间索引",用行政区划代码和Excel里的逐日数据做关联。

2.3 数据量估算与文件切分逻辑

我列一组估算数供你参考。全国省级行政区划约31个(不含港澳台数据时),地市级约333个,县级约2843个;2005到2025年跨越21年,包含闰年,按年均365.25天估算总天数约7665天。

  • 省级长表:31 × 7665 ≈ 23.7万行,Excel完全无压力;
  • 地市级长表:333 × 7665 ≈ 255万行,需要拆成两个文件或者用Access、数据库处理;
  • 县级长表:2843 × 7665 ≈ 2178万行,必须按年拆分或直接入库;
  • 县级宽表:2843行 × 约7667列,行数没问题,但列数逼近Excel上限16384列一半,操作也不算方便,主要用于程序化分析。

所以如果你拿到手发现县级Excel是按年拆分的,不是我偷懒,而是Excel本身的物理限制逼出来的。处理全县级全时间序列时,建议直接用Python或关系型数据库,后面我会给具体操作。

3. Excel端的实操:筛选、统计和绕开性能瓶颈

3.1 打开多行表之前的准备工作

如果你只关心某几个省或者某几年,建议先不要双击就硬开全量大文件。我的习惯是:

第一步,用文本编辑器或Python先看一眼文件结构和缺失值情况,别急着进Excel。第二,打开Excel后立刻按Ctrl+T把区域转成"表格",这样后续筛选、透视表、公式引用都会自动扩展范围。这一步看着不起眼,但在两千多行甚至几十万行数据里,能省掉大量"公式没拉到新行"的麻烦。第三,把日期列改成真正的日期格式,而不是文本。这个很关键,不然你用SUMIFS按日期筛选时,等值匹配还凑合,日期区间匹配就全乱套了。

如果只是想看某一天全国各地的最低气温分布,最快的操作是选中整列后加筛选条件,或者直接对日期列设筛选,再按数值排序。想快速定位极端低值,比如低于-20℃的记录,在最低气温列上做数字筛选,选择"小于 -20"即可,不用写任何公式。

3.2 高频操作:多条件筛选、SUMIFS、快速定位

Excel里处理这类逐日数据,最高频的三个函数我推荐掌握。

第一个是SUMIFS。它不仅能求和,也能当"带条件计数"用。比如统计某县2015年冬季最低气温低于-5℃的天数,可以写:

=SUMIFS(数据!最低气温列, 数据!县级代码列, "A县代码", 数据!日期列, ">=2015-12-01", 数据!日期列, "<=2016-02-29")

注意日期在SUMIFS里比较时,要保证条件和数据列的日期类型一致,不然经常返回0。

第二个是AVERAGEIFS,用来算某条件下平均最低气温,功能上和SUMIFS一致,只是返回均值。

第三个是快速定位。不光是Ctrl+F查找,也建议用"定位条件"(F5或Ctrl+G)里的"空值"选项,一键选中整列里所有缺失单元格,然后统一批量处理——例如填充-9999。这个操作对手工检查数据质量非常有效。

顺便说一个Excel里容易翻车的点:公式下拉失效。很多时候是Excel选项里"自动计算"被关了,或者单元格被设成了文本格式。解决办法是到"公式"选项卡里打开自动计算,再检查目标列格式。如果是某个文件单独出问题,检查是否加载了第三方加载项,有些统计类加载项会干扰单元格计算,这也是加载项被禁用后反而正常的常见原因。

3.3 用Python绕开Excel做批处理

数据量一旦上去,Excel本身再怎么优化也是杯水车薪。2178万行的县级长表,你可以用pandas读进来,速度取决于内存,但至少不会像Excel那样卡死。

import pandas as pd df = pd.read_csv("daily_tmin_2020.csv", encoding="utf-8") df["date"] = pd.to_datetime(df["date"]) # 筛选某县某时段 sub = df[(df["county_code"] == "110101") & (df["date"] >= "2020-01-01")] # 求该县当年最低气温及出现日期 idx = sub["tmin"].idxmin() print(sub.loc[idx])

把结果写回Excel时,我建议用openpyxl而不是直接to_excel,特别是你要同时保留多个工作表、设置列宽和格式时:

from openpyxl import Workbook wb = Workbook() ws = wb.active ws.append(["行政区划代码", "日期", "最低气温"]) for row in result.itertuples(index=False): ws.append(list(row)) wb.save("result.xlsx")

另外,Excel里很多文本查找的场景,比如要在几十万行里找包含某个字符的地名,我会在pandas里用str.contains先处理,而不是在Excel里Ctrl+F一页页翻。正则表达式也是一样,Excel的REGEXEXTRACT函数在Office 365里能用,但速度完全不能和Python比。

4. Shp端的空间操作:从属性关联到三维可视化

4.1 把Excel日值挂到行政区划面上

拿到Shp底图后,最容易的需求就是"在地图上给某一天的低温涂色"。这里有个合作分工:Shp提供面和位置,Excel提供逐日数值。关联之前,先确认两边的主键字段完全一致,通常用6位县级代码或12位村级统计用代码。

在ArcGIS里操作步骤是:先打开Shp图层,右键选择"连接和关联→连接",然后在弹窗里选择"基于某字段的连接",输入源选择Excel文件,关键字段选行政区划代码,目标图层字段也选行政区划代码。这里最容易踩的坑是字段类型不匹配——Excel里的代码列如果是数字格式,Shp里是文本格式,会导致连接后大量空值。解决方法是把两边的代码列都转成文本,或者统一补零成等长字符串。

连接完成后,按最低气温字段设置分级符号化即可。比如将某日数据分成以下几档:

温度区间含义建议配色
高于0℃无冻害风险绿
-5℃到0℃轻霜冻风险黄
-10℃到-5℃明显低温橙
-15℃到-10℃严重低温红
低于-15℃极端低温深红

配色层级建议按"绿色到深红"的渐变,不用分太多级,否则小比例尺下很难看出趋势。

4.2 叠加分析:地形、DEM与气温的空间关系

最低气温很受地形影响。同样是同一个县,山区和河谷夜间温差可以超过5℃。所以做更精细分析时,我会把Shp底图和高分辨率DEM叠加起来。

常见做法是先把DEM栅格按县级行政单元做分区统计,得到每个县的平均海拔、最低海拔或地形起伏度,然后和最低气温序列做相关分析。ArcGIS里用"分区统计"工具,QGIS里用"Zonal Statistics"插件,操作都不复杂。如果你拿到的Shp文件没有海拔字段,这个步骤正好能补上。

从DEM提取Shp相关要素也是一个被问得很多的需求。比如你想提取某个县的坡向、坡度,或者生成山谷线,可以先把DEM转成等值线,再用"要素转面"工具生成闭合多边形,最后和县级Shp做叠加裁剪。注意,提取出来的Shp不一定和气象数据一一对应,它只是地形变量,真正建模时还是要回到县级行政单元上合并。

4.3 进阶方向:shp转3dtiles与Web端展示

这两年做三维可视化需求明显多了,群里经常有人问"shp怎么转3dtiles"。我简单讲一下思路。

3dtiles是Cesium用的三维瓦片格式,适合在Web端加载海量矢量或倾斜模型。Shp转3dtiles的通用流程是:先把Shp里的要素转换成三维几何,也就是给每个面赋一个高度值,然后按瓦片层级切分,输出成带LOD的多级瓦片集合。常用工具包括CesiumLab、FME,以及一些基于GDAL二次开发的命令行工具。

操作上有几个提醒:第一,原Shp的坐标系必须和三维场景的坐标系对齐,我一般先转成WGS84经纬度;第二,属性字段能精简就精简,转瓦片后属性越多,浏览器渲染越慢,逐日气温这种大宽表强烈不建议塞进3dtiles,应该留一个日期字段,动态请求Excel或后台API的数据;第三,瓦片切分后有多个文件,部署时需要正确的网络路径,本地双击文件打开通常只能看到空场景。

如果你只是想在本地快速预览三维效果,先别急着转3dtiles,用QGIS的三维视图加载Shp并设置高度拉伸,几秒钟就能看到基础效果,确认了再上Web端流程。

5. 用这套数据前必须搞清楚的边界问题

5.1 行政区划变更:以代码为准而不是名称

2005年到2025年这21年里,我国行政区划发生过不少调整,有些县改市,有些市辖区重新划分,有些地级市换了代码。名字可能没变但代码变了,或者名字变了代码没变,这些都是实际发生过的。如果你直接用2025年的边界底图去翻2005年的逐日数据,会出现两种情况:一是代码对不上,连接后全是空值;二是名称看着对,但边界已经完全不同,做区域统计时面积和人口基准就错了。

我整理时做了一道保险:所有年份的行政区划代码都按该数据年份当时的统计口径标注,另附一份代码变更对照表。你自己使用时的原则是:先查代码,后看名称;先确认边界基准年份,再做跨期对比。不要拿2025年的Shp面去裁剪2020年以前的县均温度再做趋势,这会混入边界变化的假信号。

5.2 数据口径与数值核查

最低气温看着简单,定义却有讲究。气象上"日最低气温"有日界问题,有的以当日20时到次日20时为一个日界,有的按自然日零点到24点。两套定义在凌晨或深夜会出现1天左右的错位,对于要求严格的灾害评估,这点必须提前查清楚。

拿到数据后我也建议做一次独立核查。最简单的方法:选你所在城市,把数据里的某县最低气温序列和当地气象站发布的实况数据对比一两个典型寒潮过程。数值差异如果在0.5℃以内,一般是合格的;差异超过2℃,就要检查是不是行政区划错位、单位换算错误或者插值失真。另外,注意单位约定,如果原始表格写的是0.1℃作为单位,你要除以10才是摄氏度,这种错最容易出现在把数据从文本文件导入Excel时。

5.3 常见误区:Shp适合空间展示,不宜直接当统计本底

很多人习惯直接拿Shp属性表里的统计值做图表,这个我要专门提醒一下。Shp的几何面代表的是行政边界,但最低气温本质上来自气象站点或栅格插值,行政面积大的县和面积小的县,在同一个空间插值栅格里,代表性完全不一样。一些县级单元面积上千平方公里,区域内海拔落差可能有上千米,一个"县最低气温"值背后掩盖的信息可能很多。

我的建议是:如果做县级横向比较,看相对高低没问题;如果做精确到村、到地块的应用,至少要叠加高分辨率DEM和站点分布,做局地订正,不能把一个县的单一值硬套到乡镇。Shp在这里更像一个"可视化容器",而不是"精确气象模型输出"。这也解释了为什么我在组织数据时要单独提供Excel明细文件——空间上的统计汇总会丢信息,逐日序列才是原始依据。

数据整理到这一步,我最想跟你分享的其实是两条经验:一是用代码关联一切,不要用汉字地名做连接键,这是所有表格和空间数据能对上的前提;二是永远保留一份最原始的"长表"数据,宽表、统计表、Shp属性表都可以从长表重新生成,但长表丢了,原始信息就再也找不回来了。我最初整理时也偷懒过,后来做冷冬回算时发现列顺序和日期对齐出了问题,才知道"源头数据不能图省事"。这套2005—2025年的逐日最低气温数据,如果你只是拿来做一两个县的小分析,Excel筛选足够;如果要做全国尺度的趋势和重现期,老老实实上Python和数据库。数据本身只是原料,能不能用好,还是看你对行政边界、日期口径和单位约定这些"小事"有没有较真。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询