1. 从海温数据到气候指数:PDO究竟是什么?
如果你关注过太平洋的气候变化,或者研究过长期的气候模式,大概率听说过“PDO”这个词。它全称是“太平洋年代际振荡”,听起来有点学术,但你可以把它想象成太平洋的“长期心跳”。和咱们熟悉的厄尔尼诺(ENSO)有点像,都是海温大范围、有规律的冷暖变化。但PDO这“心跳”节奏慢得多,一次“跳动”能持续20到30年,而厄尔尼诺通常也就活跃个半年到一年半。这就好比一个是马拉松选手,一个是百米冲刺运动员。
更关键的区别在于“舞台”。PDO的主要“表演区域”在北太平洋,特别是从美国西海岸到阿拉斯加这一片,它对北美气候的影响非常显著。而厄尔尼诺的主场在热带太平洋,影响的是全球性的天气格局。还有一个让我觉得特别有意思的地方:科学家们对厄尔尼诺的成因已经摸得比较清楚了,但PDO到底为啥会这样周期性地“摇摆”,至今还有很多谜团。它更像是一个从观测数据中归纳出来的统计特征,这也是为什么我们需要通过数据分析的方法,比如EOF分析,把它从浩瀚的海温数据里“挖”出来。
那么,我们计算PDO指数到底在算什么?简单说,就是找到最能代表北太平洋海温年代际协同变化的那种“集体舞”模式。我们手头有每个月的海温数据,遍布整个北太平洋的网格点。计算PDO指数的经典方法,是先算出每个网格点每个月相对于自身长期平均的“偏差”(这叫月平均海温距平)。然后,为了剔除全球变暖这个大背景的影响,我们还得把这个偏差再减去全球平均的海温偏差。最后,对这一大堆处理好的、去除了全球趋势的北太平洋海温距平数据,进行经验正交函数(EOF)分析。分析出来的第一个,也是最重要的空间分布模式(EOF1),它所对应的时间系数(PC1),就是我们想要的PDO指数。这个指数高了,可能意味着北太平洋中部偏冷、沿岸偏暖的“暖位相”;指数低了,则可能对应相反的“冷位相”。我刚开始接触的时候,总觉得这些步骤很抽象,但跟着代码一步步做下来,看着数据一点点变成清晰的指数曲线,那种感觉特别踏实。
2. 实战第一步:获取与理解你的数据
工欲善其事,必先利其器。计算PDO指数,我们得先有海温数据。目前最常用、也最容易获取的公开数据集之一,就是NOAA发布的ERSST(Extended Reconstructed Sea Surface Temperature)。我强烈推荐使用V5版本,它的数据质量、时间长度和空间覆盖都非常适合这类研究。你可以直接去NOAA的官网找到这个数据集,通常是以NetCDF格式存储的,这种格式在气候领域是标准,用Python处理起来特别方便。
数据拿到手,别急着写代码,先用xarray这个库打开看看它的“身份证信息”。这一步能帮你避免后面90%的坑。我习惯先打印一下数据集,看看里面都有什么变量,经纬度、时间维度是怎么定义的。ERSST V5数据通常是全球2°x2°的网格,时间范围从1854年至今。但我们的目标是北太平洋(20°N-70°N, 110°E-100°W),所以第一步就是从这个全球数据里,把我们关心的那片海域“切”出来。这里要注意经度的表示方法,有些数据集用0-360°,有些用-180到180°,一定要看清楚,否则切出来的区域会错位。我一般会用sel或loc方法,结合时间切片(比如从1900年1月到2022年12月),把目标区域的数据先提取成一个子集。
import xarray as xr
import numpy as np
# 打开NetCDF文件,路径换成你自己的
path = '你的数据路径/sst.mnmean.nc'
ds = xr.open_dataset(path)
# 看看数据长什么样,关键信息都在这里
print(ds)
# 提取海温变量,并截取我们需要的时空范围
# 注意:ERSST V5的经度是0-360°,东经110度对应110,西经100度对应260(360-100)
sst_raw = ds['sst'].sel(time=slice('1900-01-01', '2022-12-01'),
lat=slice(70, 20), # 纬度从北到南
lon=slice(110, 260)) # 经度从西到东
print(f"数据形状:{sst_raw.shape}") # 应该是 (时间月数, 纬度格点数, 经度格点数)
print(f"时间范围:{sst_raw.time.min().values} 到 {sst_raw.time.max().value



被折叠的 条评论
为什么被折叠?



