如何从时间序列数据中消除季节性?

Min*_*iếu 2 weather netcdf nco cdo-climate

如何使用存储在 netcdf 文件中的数据从时间序列中删除季节性数据?我想找到一个使用 Linux 的解决方案,同时我使用 Grads 和 Ferret 进行可视化。

多谢!

Adr*_*ins 7

您可以使用 CDO 计算一年中每天/每月的平均值并从原始文件中减去:

如果文件包含每日数据:

cdo ydaysub in.nc -ydaymean in.nc deseasonalized.nc  
Run Code Online (Sandbox Code Playgroud)

同样,如果数据是每月的:

cdo ymonsub in.nc -ymonmean in.nc deseasonalized.nc  
Run Code Online (Sandbox Code Playgroud)

ydaymean 和 ymonmean 命令计算 in.nc 数据集的年度周期,即 ymonmean 返回 12 个时间片,即所有 1 月、2 月等的平均值,然后使用 sub 从原始文件中减去。我使用了管道,但在两条单独的行上可能更容易理解:

cdo ymonmean in.nc annual_cycle.nc
cdo ymonsub in.nc annual_cycle.nc deseasonalized.nc
Run Code Online (Sandbox Code Playgroud)

这完全一样,deseasonalized.nc将是相同的(几乎,由于 netcdf 全局元数据标头中的“历史记录”日志不同,会有一些字节差异),但您还将有一个带有 Annual_cycle 的新文件.nc在里面(可能也有用?)。

为什么使用ymonsuborydaysub代替sub?毕竟,在进行减法时,CDO 检测到要减去的第二个文件中的时间片数较小,因此循环遍历它。事实上有两个原因。

  1. 关于每月时间尺度的开始日期的安全性:由于季节性周期是根据与原始数据相同的文件计算的,因此简单地使用可能没问题sub,因为如果数据从四月开始,那么结果ymonmean也将从四月开始。但是,如果您想删除从不同来源计算的季节性周期,开始日期/月份可能会有所不同,并且您最终会从一月中减去四月平均值!为了避免这种情况,您可以改用该ymonsub命令。

  2. 如果使用每日数据,则闰年:如果您使用每日时间刻度,那么您肯定需要使用ydaysub,因为仅使用 sub 会忽略闰年。您的平均季节性周期文件中有 366 个时间片,因为它也有 2 月 29 日。如果您只使用sub,您每年平均会以 0.75 天的速度不同步!因此,如果您的系列涵盖 40 年,那么到系列结束时您将落后一个月(哎呀!)

后记:现在 R 和 python 中也有软件包,允许您从这些语言中访问 c​​do 的完整功能,而不必求助于使用 shell 访问工具。

编辑 2021:我现在有一个关于这个主题的视频,您可以在此处观看https://youtu.be/jKlA1ouoQIs