【问题标题】:Aggregate netCDF data to mean, min, max将 netCDF 数据聚合为均值、最小值、最大值
【发布时间】:2023-04-03 08:13:01
【问题描述】:

我有几个netCDF 文件可以下载here,由Coperinucs 创建。一共有四个文件,每个文件大约1GB。

我是这样读文件的

import xarray as xr

dset = xr.open_dataset("~/.../ERA5land1.nc")

这给了我

<xarray.Dataset>
Dimensions:    (latitude: 61, longitude: 101, time: 87647)
Coordinates:
  * latitude   (latitude) float32 31.0 30.9 30.8 30.7 ... 25.3 25.2 25.1 25.0
  * longitude  (longitude) float32 79.0 79.1 79.2 79.3 ... 88.7 88.8 88.9 89.0
  * time       (time) datetime64[ns] 1981-01-01T01:00:00 ... 1990-12-31T23:00:00
Data variables:
    t2m        (time, latitude, longitude) float32 dask.array<shape=(87647, 61, 101), chunksize=(10, 61, 101)>
Attributes:
    Conventions:  CF-1.6
    history:      2020-03-10 16:47:13 GMT by grib_to_netcdf-2.16.0: /opt/ecmw...

根据documentation 计算平均值应该是直截了当的

    mean = dset.mean()

这会导致计算机死机并最终崩溃。尝试chunk 数据也不起作用。

    dset = xr.open_dataset("~/.../ERA5land1.nc", chunks = {'time': 10})
    mean = dset.mean()

这不会崩溃,但我明白了

<xarray.Dataset>
Dimensions:  ()
Data variables:
     t2m      float32 dask.array<shape=(), chunksize=()>

我想知道如何计算每个网格单元的minmaxmean,并将其存储在具有相同规格的新netCDF 文件中。

【问题讨论】:

  • 如果您试图获得每个网格单元的平均值,您需要指定要计算的维度。试试mean = dset.mean(dim='time')mean = dset['t2m'].mean(dim='time')

标签: python dask netcdf python-xarray


【解决方案1】:

这可以使用我的包 nctoolkit 解决(通过 pip 获得:https://pypi.org/project/nctoolkit/,用户指南:https://nctoolkit.readthedocs.io/en/latest/installing.html)。

这使用 CDO 作为后端,因此应该能够轻松处理您的数据。

所需的代码与您提供的非常相似。

import nctoolkit as nc
dset = nc.open_data("~/.../ERA5land1.nc")
mean = dset.tmean()

如果你想要一个 xarray 数组,你可以这样做:

mean.to_xarray()

【讨论】:

    猜你喜欢
    • 2015-04-12
    • 2018-07-07
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2022-06-14
    • 2015-09-25
    相关资源
    最近更新 更多