将 10 分钟和 30 分钟 NETCDF 时间序列转换为每小时 + 在 Python 中删除 NaN 的函数?

问题描述

我正在尝试解析 NOAA 浮标 NetCDF 文件,并且根据它们的启动时间,每 10 分钟、30 分钟或每小时记录一次数据。我需要所有这些都在 Python 中始终如一地每小时运行一次。因此,任何少于一个小时的事情都需要取平均值。我已经看到使用 cdoresample方法,但我似乎没有多少工作。

我正在处理的 10 分钟 nc 文件示例:https://dods.ndbc.noaa.gov/thredds/fileServer/data/stdmet/41053/41053h9999.nc

我关心的三个变量是wave_height、average_wpd和mean_wave_dir。如果我可以用 9999 之类的数字替换 NaN,我就很好。我需要一个函数,可以将任何时间序列转换并平均为每小时。

解决方法

您可以尝试使用 xarray:

import xarray as xr

ds = xr.open_dataset("./41053h9999.nc")

ds_resampled = ds.resample(time='1H').mean() # or use other methods if you like see: http://xarray.pydata.org/en/stable/generated/xarray.Dataset.resample.html

# remove nans:
ds_resampled = ds_resampled.dropna('time')


,

这似乎在 CDO 中工作正常,如下所示:

cdo hourmean 41053h9999.nc outfile.nc

当我检查时输出看起来不错:

cdo showtime outfile.nc

您说,您尝试过 cdo,但没有奏效。如果您尝试过上述操作,则可能需要检查您的 CDO 版本。

如果你想在python中做到这一点,你可以使用nctoolkit,它有一个调用CDO的方法:

import nctoolkit as nc
ds = nc.open_data("infile.nc")
ds.cdo_command("hourmean") 
ds.to_nc("outfile.nc")
,

我使用 xarray 和函数 ds.resample(time="H").mean()

解决了这个问题

在将 ds 读入后,ds = xr.open_dataset('filename.nc) 是我的命名数据集