【问题标题】:get mean of netcdf file using xarray使用 xarray 获取 netcdf 文件的平均值
【发布时间】:2020-06-19 14:59:37
【问题描述】:

我用xarray在python中打开了一个netcdf文件,数据集摘要是这样的。

Dimensions:    (latitude: 721, longitude: 1440, time: 41)
Coordinates:
  * longitude  (longitude) float32 0.0 0.25 0.5 0.75 ... 359.25 359.5 359.75
  * latitude   (latitude) float32 90.0 89.75 89.5 89.25 ... -89.5 -89.75 -90.0
    expver     int32 1
  * time       (time) datetime64[ns] 1979-01-01 1980-01-01 ... 2019-01-01
Data variables:
    z          (time, latitude, longitude) float32 50517.914 ... 49769.473
Attributes:
    Conventions:  CF-1.6
    history:      2020-03-02 12:47:40 GMT by grib_to_netcdf-2.16.0: /opt/ecmw...

我想得到 z 沿纬度和经度维度的平均值。

我已尝试使用此代码:

df.mean(axis = 0)

但它正在删除时间坐标,并返回给我这样的东西。

Dimensions:  (latitude: 721, longitude: 1440)
Coordinates:
    expver   int32 1
Dimensions without coordinates: latitude, longitude
Data variables:
    z        (latitude, longitude) float32 49742.03 49742.03 ... 50306.242

我在这里做错了吗?请帮我解决这个问题。

【问题讨论】:

    标签: python netcdf geopandas python-xarray


    【解决方案1】:

    警告!!!如果您沿纬度应用,接受的答案会给您错误的结果(您需要这样做才能完全回答问题),因为您需要对每个单元格进行加权,它们的大小和当您在规则的经纬网格中向两极移动时会变小。

    Xarray 解决方案:

    因此,要制作加权意味着您需要按照以下代码构建权重:

    import numpy as np
    weights = np.cos(np.deg2rad(df.z))
    weights.name = "weights"
    z_weighted = df.z.weighted(weights)
    weighted_mean = z_weighted.mean(("longitude", "latitude"))
    

    See this discussion in the xarray documentation for further details and an example comparison.

    误差的大小取决于您平均的区域,以及变量在纬度方向上的梯度有多强 - 纬度范围和变量梯度中的区域越大,它越差。 . 对于全局温度场,这是 xarray 文档中的示例错误,超过 5 摄氏度!未加权的答案更冷,因为即使那里的网格单元要小得多,极点的计数也是一样的。

    替代 CDO 解决方案

    顺便说一句,你也可以像这样使用 cdo 从命令行执行此操作

    cdo fldmean in.nc out.nc 
    

    cdo 占网格,因此您无需担心权重问题。

    【讨论】:

    • 赞成。当然,CDO 方法的一大优势是更简单,并且适用于任何符合 CF 标准的网格
    【解决方案2】:

    您需要按维度指定 (dim) 而不是 axis

    使用df.mean(dim='longitude')

    【讨论】:

    • [stackoverflow.com/users/8643941/bwc][1] 如果我想要跨越时间的平均值。就像我想要所有给定纬度和经度上所有给定时间的温度平均值。所以我应该选择昏暗的时间吗?我想要具有(纬度,经度)维度的最终数组
    • 请注意,尽管应用于纬度时,这会给出不正确的答案,见下文。
    猜你喜欢
    • 2020-12-15
    • 2019-06-19
    • 2021-03-28
    • 2017-05-05
    • 2021-01-22
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多