You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:55:17