Python 使用xarray获取netcdf文件的平均值
我使用xarray在python中打开了一个netcdf文件,数据集摘要如下所示Python 使用xarray获取netcdf文件的平均值,python,netcdf,geopandas,python-xarray,Python,Netcdf,Geopandas,Python Xarray,我使用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 ... -
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...
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
我想得到沿纬度和经度的z值的平均值
我尝试使用以下代码:
df.平均值(轴=0)
但是它删除了时间坐标,然后像这样返回给我
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...
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
我做错什么了吗。请帮我解决这个问题。您需要按维度(
dim
)而不是轴来指定
使用df.mean(dim='longitude')
警告!!!如果你沿着纬度(你需要这样做才能完全回答问题),那么接受的答案将给出错误的结果,因为你需要对每个单元格进行称重,它们的大小不同,并且随着你在规则的纬度网格中向两极移动而变小
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文档中的示例错误,远远超过5摄氏度!未加权的答案更冷,因为两极是相等的,即使那里的网格单元小得多
替代CDO解决方案
顺便说一下,您也可以通过命令行使用cdo这样做
cdo fldmean in.nc out.nc
cdo代表了网格,因此您不必担心权重问题。[如果我想要跨时间的平均值。就像我想要跨所有给定纬度和经度的所有给定时间的温度平均值一样。因此我应该选择dim中的时间,对吗?我想要带有(纬度、经度)的最终数组维度只需注意,当应用于纬度时,这将给出错误的答案,请参见下文。向上投票。当然,CDO方法的最大优点是既简单又适用于任何符合CF的网格