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

How to remove seasonality from time series data?

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

非常感谢!

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

如果文件包含每日数据:

cdo sub in.nc -ydaymean in.nc deseasonalized.nc  

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

cdo sub in.nc -ymonmean in.nc deseasonalized.nc  

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

cdo ymonmean in.nc annual_cycle.nc
cdo sub in.nc annual_cycle.nc deseasonalized.nc

这完全一样,deseasonalized.nc 将是相同的(差不多吧,由于不同的“历史”日志,会有几个字节的差异netcdf global metadata header),但你也会有一个新文件,其中包含 annual_cycle.nc(可能也有用吗?)。

做减法的时候,CDO检测到第二个要减的文件的时间片数比较少,所以loops/cycles通过了。 注意 由于季节性周期是从与原始数据相同的文件中计算出来的,因此如果数据开始于例如四月份,ymonmean的结果也是从四月份开始的。但是,如果您想删除从不同来源计算的季节性周期,开始 day/month 可能不同,您最终会减去例如四月意味着从一月开始!为避免这种情况,您可以改用 ymonsub 命令:

cdo ymonsub full_timeseries.nc seasonal_file.nc deseasonalised.nc 

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