用 python 平均多个 netCDF4 文件
Averaging multiple netCDF4 files with python
我是 python 菜鸟中的 netCDF,所以请原谅这个菜鸟问题。
我有一个文件夹,里面装满了大约 3650 个 netCDF4 文件。十年来每天一个文件。尼罗河被命名为 yyyymmdd.nc(例如 20100101、20100102、20100103 等)。每个 .nc 文件包含同一区域(汤加专属经济区的一部分)在同一时间点的纬度、经度和温度。
我想做的是计算所有文件中每个纬度和经度的平均温度,即我想最终得到一个 .nc 文件,该文件具有相同的纬度和经度以及 10 个区域的平均温度年.
我尝试了不同的 things/versions 代码,通常,它们最终看起来像这样......
files = glob('*.nc')
ds = xr.open_mfdataset(files,)
mean = np.mean(ds['temp'][:, 0].values)
......这段代码会给我一个 .nc 文件中所有 .nc 文件的平均温度,而不是基于纬度和经度的十年文件的平均温度。
非常感谢所有帮助。
谢谢。
假设您正在 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
两个都试一下,看看哪个 works/is 最快:-)
我是 python 菜鸟中的 netCDF,所以请原谅这个菜鸟问题。
我有一个文件夹,里面装满了大约 3650 个 netCDF4 文件。十年来每天一个文件。尼罗河被命名为 yyyymmdd.nc(例如 20100101、20100102、20100103 等)。每个 .nc 文件包含同一区域(汤加专属经济区的一部分)在同一时间点的纬度、经度和温度。
我想做的是计算所有文件中每个纬度和经度的平均温度,即我想最终得到一个 .nc 文件,该文件具有相同的纬度和经度以及 10 个区域的平均温度年.
我尝试了不同的 things/versions 代码,通常,它们最终看起来像这样......
files = glob('*.nc')
ds = xr.open_mfdataset(files,)
mean = np.mean(ds['temp'][:, 0].values)
......这段代码会给我一个 .nc 文件中所有 .nc 文件的平均温度,而不是基于纬度和经度的十年文件的平均温度。
非常感谢所有帮助。
谢谢。
假设您正在 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
两个都试一下,看看哪个 works/is 最快:-)