使用python平均多个netCDF4文件

问题描述

我是 Python noob 的一个 netCDF,所以请原谅这个 noob 问题。

我有一个文件夹,里面装满了大约 3650 个 netCDF4 文件。每天一个文件,持续十年。 niles 被命名为 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 文件的平均温度,而不是基于 lat 和 lon 跨十年文件的平均温度。

非常感谢所有帮助。

谢谢。

解决方法

假设您在 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()
,

您可以使用 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 

尝试两种方法,看看哪个有效/最快 :-)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...