使用 Python 读取和处理数据并绘制 AMO、PDO 和 ENSO 年平均时间序列图

本教程演示如何使用 Python 从 NOAA 网站读取 AMO、PDO 和 ENSO 数据,计算其年平均值,并绘制其时间序列图,并根据正负值使用红色和蓝色填充。

1. 导入库

首先,导入所需的库:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

2. 读取数据

从 NOAA 网站读取 AMO、PDO 和 ENSO 数据。

2.1 读取 AMO 数据

amo_url = 'https://psl.noaa.gov/data/correlation/amon.sm.data'
amo_data = pd.read_csv(amo_url, sep='\s+', header=None, skiprows=1, names=['Year'] + list(range(1, 13)))
amo_data = amo_data.melt(id_vars='Year', var_name='Month', value_name='AMO')
amo_data['Date'] = pd.to_datetime(amo_data['Year'].astype(str) + '-' + amo_data['Month'].astype(str))
amo_data = amo_data.set_index('Date')

2.2 读取 PDO 数据

pdo_url = 'https://www.ncei.noaa.gov/pub/data/cmb/ersst/v5/index/ersst.v5.pdo.dat'
pdo_data = pd.read_csv(pdo_url, sep='\s+', header=None, skiprows=1, names=['Year'] + list(range(1, 13)))
pdo_data = pdo_data.melt(id_vars='Year', var_name='Month', value_name='PDO')
pdo_data['Date'] = pd.to_datetime(pdo_data['Year'].astype(str) + '-' + pdo_data['Month'].astype(str))
pdo_data = pdo_data.set_index('Date')

2.3 读取 ENSO 数据

enso_url = 'https://psl.noaa.gov/data/correlation/oni.data'
enso_data = pd.read_csv(enso_url, header=None, skiprows=1, names=['Year', 'DJF', 'JFM', 'FMA', 'MAM', 'AMJ', 'MJJ', 'JJA', 'JAS', 'ASO', 'SON', 'OND'])
enso_data = enso_data.melt(id_vars='Year', var_name='Month', value_name='ENSO')
enso_data['Date'] = pd.to_datetime(enso_data['Year'].astype(str) + '-' + enso_data['Month'].astype(str))
enso_data = enso_data.set_index('Date')

3. 计算年平均值

# 计算AMO年平均值
amo_annual = amo_data.resample('A').mean()

# 计算PDO年平均值
pdo_annual = pdo_data.resample('A').mean()

# 计算ENSO年平均值
enso_annual = enso_data.resample('A').mean()

4. 绘制时间序列图

# 画图
fig, ax = plt.subplots(figsize=(12, 6))

# AMO
ax.fill_between(amo_annual.index, 0, amo_annual['AMO'], where=amo_annual['AMO'] > 0, interpolate=True, color='red')
ax.fill_between(amo_annual.index, 0, amo_annual['AMO'], where=amo_annual['AMO'] < 0, interpolate=True, color='blue')
ax.plot(amo_annual.index, amo_annual['AMO'], label='AMO')

# PDO
ax.fill_between(pdo_annual.index, 0, pdo_annual['PDO'], where=pdo_annual['PDO'] > 0, interpolate=True, color='red')
ax.fill_between(pdo_annual.index, 0, pdo_annual['PDO'], where=pdo_annual['PDO'] < 0, interpolate=True, color='blue')
ax.plot(pdo_annual.index, pdo_annual['PDO'], label='PDO')

# ENSO
ax.fill_between(enso_annual.index, 0, enso_annual['ENSO'], where=enso_annual['ENSO'] > 0, interpolate=True, color='red')
ax.fill_between(enso_annual.index, 0, enso_annual['ENSO'], where=enso_annual['ENSO'] < 0, interpolate=True, color='blue')
ax.plot(enso_annual.index, enso_annual['ENSO'], label='ENSO')

# 格式化图表
ax.set_xlabel('Year')
ax.set_ylabel('Index')
ax.set_title('Time Series of AMO, PDO and ENSO')
ax.legend()
plt.xticks(np.arange(1850, 2020, 10))
plt.show()

5. 结果

运行代码后,将生成一个包含 AMO、PDO 和 ENSO 年平均时间序列图的图表,其中正值用红色填充,负值用蓝色填充。

6. 小结

本教程演示了如何使用 Python 从 NOAA 网站读取和处理数据,并绘制时间序列图。这个过程可以应用于其他气候数据和指标,以探索和分析其时间变化趋势。

Python 读取和处理数据并绘制 AMO、PDO 和 ENSO 年平均时间序列图

原文地址: https://www.cveoy.top/t/topic/nF3n 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录