共计 2205 个字符,预计需要花费 6 分钟才能阅读完成。
初识 cn05.1 数据集
cn05.1 是中国气象局发布的高分辨率格点观测数据集,覆盖中国区域(含港澳台)的日值气象要素。它整合了 2400 多个地面观测站数据,经过严格的质量控制和空间插值处理,具有以下核心特点:

- 时间跨度:1961 年至今(持续更新)
- 空间分辨率:0.5°×0.5°经纬度网格
- 包含要素:气温、降水、风速等 10 余种常用气象变量
- 典型应用:气候趋势分析、极端天气研究、农业气象模型输入等
数据获取与结构解析
通过中国气象数据网(http://data.cma.cn)申请下载后,解压得到如下目录结构:
cn05.1/
├── README.pdf # 官方说明文档
├── TEMP/ # 温度数据
│ ├── TEMP_1961-1990.nc
│ └── TEMP_1991-2020.nc
├── PRE/ # 降水数据
│ ├── PRE_1961-1990.nc
│ └── PRE_1991-2020.nc
└── META/ # 元数据
├── stations.csv
└── grid_info.json
Python 数据处理实战
环境准备
安装必要库(建议使用 conda 环境):
conda install -c conda-forge xarray pandas matplotlib
数据加载示例
import xarray as xr
import pandas as pd
import numpy as np
def load_cn05_data(file_path, var_name='temp'):
"""
加载 cn05.1 的 NetCDF 格式数据
:param file_path: 数据文件路径
:param var_name: 目标变量名(默认为温度):return: xarray.Dataset 对象
"""
try:
ds = xr.open_dataset(file_path)
# 统一变量名大小写处理
var_key = [v for v in ds.data_vars if v.lower() == var_name.lower()]
if not var_key:
raise ValueError(f"变量 {var_name} 不存在于数据集中")
print(f"成功加载: {file_path}")
print(f"时间范围: {ds.time.min().item()} 至 {ds.time.max().item()}")
return ds[var_key[0]]
except FileNotFoundError:
print(f"错误:文件 {file_path} 不存在")
except Exception as e:
print(f"数据加载异常: {str(e)}")
# 示例调用
temp_data = load_cn05_data('cn05.1/TEMP/TEMP_1991-2020.nc')
数据清洗与可视化
import matplotlib.pyplot as plt
def process_temp_data(da):
"""温度数据处理范例"""
# 1. 缺失值处理(填充为前后 5 天均值)da = da.interpolate_na(dim='time', method='linear', fill_value='extrapolate')
# 2. 异常值过滤(<-40℃或 >50℃视为异常)da = da.where((da > -40) & (da < 50))
# 3. 计算年平均温度
yearly_mean = da.groupby('time.year').mean()
# 可视化
plt.figure(figsize=(12, 5))
yearly_mean.plot.line(x='year')
plt.title('中国区域年平均温度变化趋势')
plt.ylabel('温度(℃)')
plt.grid(True)
plt.show()
return yearly_mean
# 执行处理
processed_data = process_temp_data(temp_data)
常见问题解决方案
问题 1:内存不足
当处理多年份数据时,建议:
- 使用
xr.open_mfdataset分块读取 - 设置
chunks={'time': 365}参数进行分块处理 - 及时释放内存:
ds.close()
问题 2:缺失值处理
根据气象数据特点推荐方法:
- 时间插值:
interpolate_na(dim='time') - 空间插值:
da.ffill(dim='lat').bfill(dim='lon') - 对持续缺失超过 15 天的记录标记为特殊值
三大实战应用建议
- 气候趋势分析
- 计算滑动平均(如 10 年滑动)
- 使用 Mann-Kendall 检验显著性
-
示例:分析 1990 年后变暖速率
-
极端事件检测
- 定义热浪(连续 3 天 >35℃)
- 计算极端降水阈值(95 分位数)
-
示例:统计华北平原极端高温日数变化
-
区域对比研究
- 使用
sel(lat=slice(30,40), lon=slice(110,120))选取长江中下游区域 - 对比不同气候区温度增幅差异
- 示例:对比西南与东北地区降水变化趋势
进阶思考题
- 如何利用 cn05.1 数据集验证 CMIP6 模式在中国区域的模拟效果?
- 当需要将 cn05.1 的 0.5°数据降尺度到更高分辨率时,有哪些可行的技术路线?
写在最后
经过一周的实际项目使用,我发现 cn05.1 的降水数据在西部站点稀疏区域存在明显插值误差,建议结合站点观测数据做二次校正。另外,xarray 的 resample 方法在计算月均值时非常高效,比传统循环快 20 倍以上。期待大家挖掘出更多有趣的应用场景!
正文完
