Python - 两个 netcdf 文件之间的 xarray 平均值
Python - xarray mean between two netcdf files
我有每年的 nc 文件,每个文件都包含每日最低和最高温度数据。
我想做的是用这两个变量获得平均温度。
我认为使用 xarray 会更容易,我设法将所有文件合并为一个文件,如下所示:
import netCDF4 as nc
import numpy as np
import xarray
tmin = xarray.open_mfdataset('TMIN*.nc',combine = 'by_coords', concat_dim="time")
tmax = xarray.open_mfdataset('TMAX*.nc',combine = 'by_coords', concat_dim="time")
然后,我尝试做类似的事情:tavg = (tmax - tmin) / 2
但我得到一个空数组(如下所示):
<xarray.Dataset>
Dimensions: (lat: 294, lon: 402, time: 25567)
Coordinates:
* lat (lat) float32 11.9125 11.995833 12.079166 ... 36.245834 36.329166
* lon (lon) float32 -119.4375 -119.354164 ... -86.104164 -86.020836
* time (time) datetime64[ns] 1950-01-01 1950-01-02 ... 2019-12-31
Data variables:
*empty*
如何获取每天两个变量之间的平均值?
按照建议,这里是 tmin 和 tmax 的总结:
<xarray.Dataset>
Dimensions: (lat: 294, lon: 402, time: 25567)
Coordinates:
* lon (lon) float32 -119.4375 -119.354164 ... -86.104164 -86.020836
* lat (lat) float32 11.9125 11.995833 12.079166 ... 36.245834 36.329166
* time (time) datetime64[ns] 1950-01-01 1950-01-02 ... 2019-12-31
Data variables:
TMAX (time, lat, lon) float32 dask.array<chunksize=(365, 294, 402), meta=np.ndarray>
<xarray.Dataset>
Dimensions: (lat: 294, lon: 402, time: 25567)
Coordinates:
* lon (lon) float32 -119.4375 -119.354164 ... -86.104164 -86.020836
* lat (lat) float32 11.9125 11.995833 12.079166 ... 36.245834 36.329166
* time (time) datetime64[ns] 1950-01-01 1950-01-02 ... 2019-12-31
Data variables:
TMIN (time, lat, lon) float32 dask.array<chunksize=(365, 294, 402), meta=np.ndarray>
我认为你的问题是 Tmin 和 Tmax 是数据集而不是数据数组。
如果您尝试将两个数据集相加,xarray 不知道如何将数据集中的变量相加。毕竟一个数据集中可以有多个变量。
要解决这个问题,您只需 select 您想要添加的数据集中的变量。
import xarray as xr
import numpy as np
lon = np.arange(129.4, 153.75+0.05, 0.25)
lat = np.arange(-43.75, -10.1+0.05, 0.25)
Tmin = 10 * np.random.rand(len(lat), len(lon))
Tmax = 10 * np.random.rand(len(lat), len(lon))
Tmin = xr.Dataset({"Tmin": (["lat", "lon"], Tmin)},coords={"lon": lon,"lat": lat})
Tmax = xr.Dataset({"Tmax": (["lat", "lon"], Tmax)},coords={"lon": lon,"lat": lat})
# Just checking the datasets are not empty
print(Tmin)
print(Tmax)
# This will return an empty array as per your example
tavg = (Tmax+Tmin)/2
print(tavg)
# Selecting the variable should work
tavg = (Tmax['Tmax']+Tmin['Tmin'])/2
print(tavg)
我有每年的 nc 文件,每个文件都包含每日最低和最高温度数据。
我想做的是用这两个变量获得平均温度。
我认为使用 xarray 会更容易,我设法将所有文件合并为一个文件,如下所示:
import netCDF4 as nc
import numpy as np
import xarray
tmin = xarray.open_mfdataset('TMIN*.nc',combine = 'by_coords', concat_dim="time")
tmax = xarray.open_mfdataset('TMAX*.nc',combine = 'by_coords', concat_dim="time")
然后,我尝试做类似的事情:tavg = (tmax - tmin) / 2
但我得到一个空数组(如下所示):
<xarray.Dataset>
Dimensions: (lat: 294, lon: 402, time: 25567)
Coordinates:
* lat (lat) float32 11.9125 11.995833 12.079166 ... 36.245834 36.329166
* lon (lon) float32 -119.4375 -119.354164 ... -86.104164 -86.020836
* time (time) datetime64[ns] 1950-01-01 1950-01-02 ... 2019-12-31
Data variables:
*empty*
如何获取每天两个变量之间的平均值?
按照建议,这里是 tmin 和 tmax 的总结:
<xarray.Dataset>
Dimensions: (lat: 294, lon: 402, time: 25567)
Coordinates:
* lon (lon) float32 -119.4375 -119.354164 ... -86.104164 -86.020836
* lat (lat) float32 11.9125 11.995833 12.079166 ... 36.245834 36.329166
* time (time) datetime64[ns] 1950-01-01 1950-01-02 ... 2019-12-31
Data variables:
TMAX (time, lat, lon) float32 dask.array<chunksize=(365, 294, 402), meta=np.ndarray>
<xarray.Dataset>
Dimensions: (lat: 294, lon: 402, time: 25567)
Coordinates:
* lon (lon) float32 -119.4375 -119.354164 ... -86.104164 -86.020836
* lat (lat) float32 11.9125 11.995833 12.079166 ... 36.245834 36.329166
* time (time) datetime64[ns] 1950-01-01 1950-01-02 ... 2019-12-31
Data variables:
TMIN (time, lat, lon) float32 dask.array<chunksize=(365, 294, 402), meta=np.ndarray>
我认为你的问题是 Tmin 和 Tmax 是数据集而不是数据数组。
如果您尝试将两个数据集相加,xarray 不知道如何将数据集中的变量相加。毕竟一个数据集中可以有多个变量。
要解决这个问题,您只需 select 您想要添加的数据集中的变量。
import xarray as xr
import numpy as np
lon = np.arange(129.4, 153.75+0.05, 0.25)
lat = np.arange(-43.75, -10.1+0.05, 0.25)
Tmin = 10 * np.random.rand(len(lat), len(lon))
Tmax = 10 * np.random.rand(len(lat), len(lon))
Tmin = xr.Dataset({"Tmin": (["lat", "lon"], Tmin)},coords={"lon": lon,"lat": lat})
Tmax = xr.Dataset({"Tmax": (["lat", "lon"], Tmax)},coords={"lon": lon,"lat": lat})
# Just checking the datasets are not empty
print(Tmin)
print(Tmax)
# This will return an empty array as per your example
tavg = (Tmax+Tmin)/2
print(tavg)
# Selecting the variable should work
tavg = (Tmax['Tmax']+Tmin['Tmin'])/2
print(tavg)