【问题标题】:Averaging multiple netCDF4 files with python用python平均多个netCDF4文件
【发布时间】:2021-08-24 08:52:51
【问题描述】:

我在 python 菜鸟方面有点 netCDF,所以请原谅这个菜鸟问题。

我有一个文件夹,里面有大约 3650 个 netCDF4 文件。每天一个文件,持续十年。尼罗河被命名为 yyyymmdd.nc(例如 20100101,20100102,20100103 等)。每个 .nc 文件都包含同一区域(汤加专属经济区的一部分)的某个时间点的纬度、经度和温度。

我要做的是从所有文件中计算每个纬度和经度的平均温度,即我想最终得到一个 .nc 文件,该文件具有所有相同的经度和经度以及 10 年的平均温度。

我尝试过不同的东西/版本的代码,通常,它们最终看起来像这样.....

files = glob('*.nc')
ds = xr.open_mfdataset(files,)
mean = np.mean(ds['temp'][:, 0].values)

......这段代码会给我一个.nc文件中所有.nc文件的平均温度,而不是十年文件中基于纬度和经度的平均温度。

非常感谢所有和任何帮助。

谢谢。

【问题讨论】:

  • 我觉得mean = np.mean(ds['temp'][:, 0].values) 不是好方法,因为您已经剪切了一些数据。 ds['temp'] 的维度是多少? mean = np.mean(ds['temp'][:].values,axis=0) 有效吗?

标签: python numpy average netcdf4


【解决方案1】:

假设你在 linux/macOS 上工作,这可以使用我的 nctoolkit 包轻松完成(详见here)。

以下将计算所有文件的平均值,然后绘制结果:

import nctoolkit as nc
files = glob('*.nc')
ds = nc.open_data(file)
ds.ensemble_mean()
ds.plot()

nctoolkit 默认使用 CDO 作为后端,但也可以使用 NCO,这可以提高性能。所以以下可能会更快:

import nctoolkit as nc
files = glob('*.nc')
ds = nc.open_data(file)
ds.ensemble_mean(nco=True)
ds.plot()

【讨论】:

  • 这就像一个魅力。为 nctoolkit 点赞。
  • 嗨罗伯特。再次感谢您向我介绍这一点。 ncookit 真的让我的事情变得更容易了。我有一个快速跟进的问题。使用 ds.ensemble 我还可以计算标准偏差。我已经尝试过 ds.ensemble_stdev(nco=True) ,但是找不到 stdev 这个错误。
  • 谢谢。在这一分钟没有。但我可以相对容易地实现这一点。如果你迫切需要这个功能,你可以在这里提出问题github.com/pmlmodelling/nctoolkit/issues,我可以快速将它添加到开发版本中
【解决方案2】:

您可以使用 cdo 包在输入文件名中使用通配符来执行此操作。虽然我只用少量文件对其进行了测试,但需要注意的是,您可能会达到系统打开文件数量的限制。

from cdo import *
cdo=Cdo()
cdo.ensmean(input='*.nc',output='ensmean.nc')

这基本上相当于命令行调用 cdo

cdo ensmean *.nc ensmean.nc 

也就是说,在我看来,将它们组合在一起然后使用 timmean 会更好:

cdo.timmean(input=cdo.mergetime(input='*.nc'),output='timmean.nc')

这又是 python 等价于

cdo mergetime *.nc all.nc
cdo timmean all.nc timmean.nc 

两者都试一下,看看哪一个工作/最快:-)

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 2015-06-30
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多