如何基于.nc文件绘制30年周期降水数据的线性回归线
处理CRU TS4.06降水数据并绘制季节降水趋势线
一、规避CSV转换崩溃的高效处理逻辑
直接全量转CSV会因数据体量过大(720×360×1452≈3.7亿条记录)触发内核崩溃,无需全量导出,用xarray直接完成聚合筛选后,再生成小体量DataFrame供Seaborn调用:
- 先通过时间重采样提取季节降水均值,同时可按需做空间平均(或提取单格点数据)
- 筛选目标30年数据,大幅压缩数据量
- 转换为DataFrame时仅保留聚合后的数据,避免内存溢出
二、具体代码实现
假设已通过xarray读取数据,降水变量名为pre:
import xarray as xr import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 假设已读入数据:ds = xr.open_dataset('cru_ts4.06_precip.nc') # 1. 计算区域平均降水(若需单格点,跳过此步,用.sel(lon=XX, lat=YY, method='nearest')提取) pre_region_avg = ds['pre'].mean(dim=['lon', 'lat']) # 2. 按季节重采样并计算均值,QS-DEC表示以12月为季节起始(对应北半球DJF/MAM/JJA/SON) pre_seasonal = pre_region_avg.resample(time='QS-DEC').mean() # 3. 筛选30年数据,示例取1992-2021年 pre_30y = pre_seasonal.sel(time=slice('1992-01-01', '2021-12-31')) # 4. 转换为DataFrame并添加年份、季节标签 df = pre_30y.to_dataframe(name='precip') df['year'] = df.index.year # 映射季节名称 season_map = { 'Dec': 'DJF', 'Jan': 'DJF', 'Feb': 'DJF', 'Mar': 'MAM', 'Apr': 'MAM', 'May': 'MAM', 'Jun': 'JJA', 'Jul': 'JJA', 'Aug': 'JJA', 'Sep': 'SON', 'Oct': 'SON', 'Nov': 'SON' } df['season'] = df.index.strftime('%b').map(season_map) # 修正DJF年份(如2021年12月属于2021/2022冬季,按需调整) df.loc[df.index.month == 12, 'year'] += 1 # 5. 用Seaborn绘制分季节线性回归线 plt.figure(figsize=(12, 8)) sns.lmplot( x='year', y='precip', hue='season', data=df, col='season', col_wrap=2, height=4, scatter_kws={'alpha': 0.6}, line_kws={'color': 'darkred'} ) plt.suptitle('30-Year Seasonal Precipitation Trend', y=1.02) plt.show()
三、关键细节说明
- 单格点数据处理:若无需区域平均,替换第一步为
pre_point = ds['pre'].sel(lon=116.4, lat=39.9, method='nearest')(输入目标经纬度) - 滑动30年窗口:如需滑动30年平均的季节趋势,用
pre_seasonal.rolling(time=30*4, center=True).mean()(每个季节对应30年滑动窗口) - 季节定义调整:南半球可改用
QS-MAR作为重采样频率,对应南半球季节划分
内容的提问来源于stack exchange,提问作者cluelesscoder
相关产品推荐
相关产品推荐

