气象数据

典型气象年(TMY)方法 — 从多年序列到一年代表

· 南京运梦科技算法团队 · 评审 算法负责人

典型气象年(TMY)方法 — 从多年序列到一年代表 封面

做光伏或光热项目的前期评估时,几乎每个团队都会遇到同一个问题:手里攥着站址十几二十年的逐小时气象序列,到底拿哪一年去喂发电量模型?随便挑一个真实年份,可能正好赶上某年厄尔尼诺、某年火山气溶胶、某年异常多云,算出来的年发电量要么偏高要么偏低,根本不"典型"。把所有年份都跑一遍再取平均当然更稳,但建模软件一次只吃一年的 8760 小时,逐年跑既慢又难管理。

典型气象年(Typical Meteorological Year,TMY)就是为了解决这个矛盾而生的。它的核心思路非常朴素:与其用某一个真实年份,不如从多年观测里,为每个日历月各挑出"最典型"的那一个月,再把 12 个来自不同年份的月份拼接成一个虚拟的"代表年"。这一年里的 1 月可能来自 2003 年、7 月可能来自 1998 年,它在现实中从未真实发生过,却在统计意义上最贴近这个站址的长期气候。

这套方法的权威实现,是美国国家可再生能源实验室(NREL)的 TMY3 数据集。本文带你读懂 Wilcox 与 Marion(2008)的 TMY3 用户手册:它怎么用 Finkelstein-Schafer 统计量来选月、为什么 TMY 代表"典型"而非"极端"、它适合用来做什么又绝不能用来做什么,以及如何用运梦气象 API 的 ERA5 长序列,为你自己的站址构建一份本地化 TMY。

关键要点

  • TMY 是一个"虚拟代表年":从多年(如 TMY3 用的 1991-2005)逐月资料中,为每个日历月挑出最典型的一个月,再把 12 个来自不同年份的月份拼接成一年。
  • 选月用 Finkelstein-Schafer(FS)统计量:比较候选月各气象要素的累积分布函数(CDF)与多年长期 CDF 的接近程度,加权求和后选 FS 统计量最小(最接近长期典型)的那个月。
  • 权重在 TMY3 中以辐射为主:因为面向太阳能应用,全球水平辐射(GHI)和干球温度等要素被赋予较高权重。
  • TMY 代表"典型/平均"年景,不含极端年:它不能用于评估极端事件或最差年场景,那需要 P90 等概率口径另行处理。
  • 用途是长期模拟的标准气象输入:建筑能耗、光伏与光热长期发电量模拟普遍以 TMY 作为统一的代表性输入。

背景与定位

这份用户手册的作者 Stephen Wilcox 与 William Marion 均来自 NREL,发布于 2008 年,报告编号 NREL/TP-581-43156。它配套的是基于国家太阳辐射数据库(NSRDB)生成的 TMY3 数据集——主体源自 1991-2005 NSRDB 更新版,记录较长的站点则使用 1976-2005(合并 1961-1990 NSRDB v1.1),覆盖美国及其属地共 1020 个站点,是建筑与可再生能源行业引用极广的一份技术文档。

需要说明的是,TMY 的方法论本身并非始于 TMY3。把多年资料浓缩成一个代表年的思路,最早见于 Hall 等人 1978 年在桑迪亚实验室(Sandia Laboratories)的工作,业界因此也常把它称为"桑迪亚方法"。TMY3 是这一方法在更长、更高质量数据库上的工程化落地,并把覆盖范围和站点密度推到了一个新的量级。

它之所以重要,是因为它把"代表性"这件主观的事,变成了一个可复现的统计流程。在 TMY3 出现之前,不同机构对"哪一年算典型"往往各执一词;有了统一的 FS 选月口径和公开的数据集,光伏、光热、建筑能耗等领域才有了一个可以横向比较、互相对账的气象基准。对做投融资尽调的人来说,"基于 TMY 的模拟结果"已经成了一种行业通用语言。

方法 / 它做了什么

TMY 的构建可以拆成三步:算长期分布、逐月打分、拼接成年。第一步,对数据库覆盖的所有年份,分别统计每个日历月里各气象要素的长期累积分布函数。比如把 1991 到 2005 年所有 7 月的日值合在一起,得到"7 月 GHI 的长期 CDF"——这就是衡量某个候选 7 月是否典型的标尺。

第二步是核心,用 Finkelstein-Schafer 统计量给每个候选月打分。对某一年的某个具体月份(例如 1998 年 7 月),同样算出它自己的 CDF,然后逐点比较它与长期 CDF 的差异:两条曲线越贴近,说明这个月越接近长期典型,FS 统计量就越小。多个气象要素(尤其是全球水平辐射、干球温度等)各算一份 FS 统计量,再按预设权重加权求和,得到这个候选月的综合得分。在 TMY3 中,由于数据集主要面向太阳能应用,辐射类要素被赋予了较高的权重,这意味着选出来的月份会优先保证辐射条件的代表性。

第三步,对每个日历月,从所有年份的候选里挑出加权 FS 统计量最小的那一个,作为该月的"典型气象月"(TMM)。12 个日历月各选一个,拼起来就是这个站址的 TMY。手册中还包含一些辅助筛选与月际衔接处理,用于避免相邻月份来自差异过大的年份时在拼接处产生不自然的跳变,但主干逻辑就是上面这条"CDF 比对 + 加权选最小"的链路。

理解这条链路,能帮你看清 TMY 的本质:它不是"平均年",而是"挑出来的真实月份的拼盘"。每个月都是历史上真实发生过的某个月,保留了真实的逐小时波动、天气过程和昼夜节律——这一点对发电量模拟很关键,因为简单地对多年逐时取平均会把云的进出、辐射的间歇性都抹平,得到一条不真实的"光滑曲线"。TMY 用"选代表"代替"求平均",既保住了典型性,又保住了物理真实感。

关键结论

  1. TMY 是多年逐月资料里"挑月拼接"的产物,而非某个真实年份,也不是逐时平均。这是手册定义的核心,也是 TMY 与"平均年"最本质的区别。
  2. 选月依据是 Finkelstein-Schafer 统计量:比较候选月与长期的累积分布函数,加权后取 FS 统计量最小者。要素与权重由使用者设定,TMY3 中以辐射为主。
  3. TMY 代表典型、平均的年景,不含极端年。手册明确它不适合用来评估极端事件或最差年场景——这类需求要用 P90 等概率口径单独处理,不能直接拿 TMY 去算。
  4. TMY3 基于 NSRDB 生成(主体记录期 1991-2005,长记录站点为 1976-2005),覆盖美国及属地 1020 个站点。这是这一版数据集公开报告的时间范围与站点规模。
  5. 它的定位是长期模拟的标准气象输入,服务于建筑能耗、光伏与光热长期发电量模拟等场景。

需要提醒的是,本文出现的具体数字(记录期 1991-2005 为主体、长记录站点 1976-2005,1020 个站点等)均来自 TMY3 用户手册本身。若你在其他材料里看到"TMY 比真实年偏差 X%"之类的说法,那通常是某项工程实践或案例研究的经验值(工程经验/示意),并非这份手册的结论,不应混为一谈。

对新能源 / 运梦平台的意义

对国内的新能源项目来说,TMY3 本身只覆盖美国站点,并不能直接拿来用。但它的方法论是普适的:只要你有某个站址足够长的高质量逐小时气象序列,就能用同一套 FS 选月流程,构建出属于这个站址的本地 TMY。这正是运梦气象 API 能补上的环节——TMY3 提供方法,长序列再分析数据提供原料。

运梦平台的 ERA5 数据源能为任意经纬度点提供逐小时的历史再分析序列,时间跨度足以覆盖近二三十年。这意味着你可以为云南某个山地光伏站、内蒙古某个风光基地,直接拉取它的 rsds(地表下行短波辐射)、tas(气温)、ws(风速)、hurs(相对湿度)等长序列,再按 Finkelstein-Schafer 法逐月选典型月、拼接成本地 TMY,喂给 PVsyst、SAM 等发电量模拟工具。整个过程不依赖现场实测站,前期评估阶段就能跑通。

要强调的一点是分工:TMY 解决的是"用哪一年的典型气候做长期产量评估"的问题,它是历史统计口径,不是预报。如果你需要的是未来几天的发电功率预测、运维排班或电力交易申报,那属于另一条链路——运梦平台的预报数据由德国气象局(DWD)提供,用 ger 数据源单独获取,不要把 TMY 当预报用,也不要把预报塞进长期评估。

还有一个边界要守住:TMY 是"典型",不是"最差"。投融资尽调里常被问到的 P90 发电量(即 90% 置信水平下的保底产量),衡量的是不利年景下的风险,TMY 给不出这个答案。正确做法是用 ERA5 的多年逐年序列分别建模、统计年际波动,再推算 P50/P90。TMY 负责"典型情景",逐年序列负责"风险分布",两者配合才完整。

在运梦气象 API 上手

下面这个例子用运梦气象 API 的 downloadSync 接口,从 era5 数据源拉取某站址多年的逐小时序列,作为构建本地 TMY 的原料。字段包含辐射三件套 rsds/dni/dhi(地表下行短波、法向直接、散射辐射,单位均为 W/m²)、tas(气温,单位 °C)、ws(风速,单位 m/s)和 hurs(相对湿度,单位 %)。拿到长序列后,你就可以在本地按 Finkelstein-Schafer 法逐月选典型月、拼接成 TMY。注意 stime/etimeYYYY-MM-DD HH:MM 格式,timezone8 表示东八区。

{
  "dataSourceId": "era5",
  "lat": 25.04,
  "lon": 102.71,
  "stime": "1996-01-01 00:00",
  "etime": "2025-12-31 23:00",
  "fields": ["rsds", "dni", "dhi", "tas", "ws", "hurs"],
  "timezone": "8"
}

实际工程中,建议先用近 20-30 年的完整年序列做 FS 选月,再把拼出来的 TMY 与逐年模拟的产量分布交叉验证:TMY 模拟值应当落在 P50 附近,若明显偏离,往往说明权重设置或数据质控环节需要复查。需要短临功率预测时,把 dataSourceId 切到 ger 即可走德国气象局的预报链路,二者职责分明、互不替代。

常见问题

问:TMY 既然是拼出来的虚拟年,逐小时数据还真实吗? 答:真实。TMY 拼接的每个月都是历史上真实发生过的某年某月,保留了原始的逐小时波动、天气过程和昼夜节律,只是把不同年份的代表月拼到了一起。它不是逐时平均,所以不会出现"被抹平的光滑曲线"。

问:为什么不直接对多年逐小时取平均,省去选月这一步? 答:因为对辐射等间歇性要素做逐时平均,会把云的进出、晴雨交替都平均掉,得到一条物理上不存在的平滑曲线,发电量模拟会因此失真。FS 选月用"挑真实月份"代替"求平均",既保住典型性又保住物理真实感。

问:TMY 能用来算 P90 保底发电量或评估极端年吗? 答:不能。TMY 代表典型、平均年景,本身不含极端年信息。P90、最差年等风险口径需要用多年逐年序列分别建模、统计年际波动后推算,这是另一条与 TMY 互补的链路。

问:TMY3 覆盖美国 1020 个站,国内站址怎么办? 答:TMY3 数据集本身只覆盖美国,但方法论通用。用运梦气象 API 的 era5 拉取你站址的多年逐小时序列,按 Finkelstein-Schafer 法自行构建本地 TMY 即可,不受地理范围限制。

问:构建 TMY 用历史数据,那预报数据走哪个源? 答:TMY 属于历史统计,用 era5。短临与中期预报是另一回事,运梦平台的预报由德国气象局(DWD)提供,用 ger 数据源获取。两者不要混用。

引用与原文

Wilcox, S., & Marion, W. (2008). Users Manual for TMY3 Data Sets (NREL/TP-581-43156). National Renewable Energy Laboratory. (TMY 方法最早见于 Hall, I. J. et al., 1978, Sandia Laboratories) DOI: doi.org/10.2172/928611