python - 使用 xarray 获取 netcdf 文件的平均值
问题描述
我使用 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
我在这里做错什么了吗。请帮我解决一下这个。
解决方案
警告!如果您沿纬度应用,接受的答案会给您错误的结果(您需要这样做才能完全回答问题),因为您需要对每个单元格进行加权,它们的大小不同,并且随着您向在规则的纬度网格中的极点。
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"))
有关更多详细信息和示例比较,请参阅 xarray 文档中的此讨论。
误差的大小取决于您要平均的区域,以及变量在纬度方向上的梯度有多强 - 纬度范围和可变梯度中的区域越大,它越差......对于一个全局温度场这是 xarray 文档中的示例错误,超过 5 摄氏度!未加权的答案更冷,因为即使那里的网格单元要小得多,极点的计数也是一样的。
替代 CDO 解决方案
顺便说一句,您也可以像这样使用 cdo 从命令行执行此操作
cdo fldmean in.nc out.nc
cdo 占网格,因此您无需担心权重问题。
推荐阅读
- python - 如何在 python 上使用 seleinum 获取页面中的属性?
- ruby-on-rails - 在 Rails 中解析来自 CURL 的 Json 请求
- python - 收到错误“两个形状中的维度 0 必须相等,但为 2 和 1。” 尝试拟合 keras 模型时
- ruby-on-rails - ActiveSupport TimeZone 不返回所有区域
- php - 提交响应时如何避免生成新的随机值?
- asp.net-core - .NET 服务参考发送错误的接受标头(文本/纯文本)
- android - Android 通知媒体样式 - 不必要的按钮可见
- visual-studio-code - 如何更改 VSCode 字体
- android-studio - Android 上的 QApplication,从 JNI 开始,一直到 SEGFAULT
- r - 如何在数据框中选择/过滤/删除仅包含 NA 或 N/A 字符串的列?