屏蔽数据集以使 Xarray 中的维度相同(使用 where 函数)
Mask datasets to make dimensions identical in Xarray (using where function)
我遇到了这个简单的问题,但我还没有找到解决方法。我有两个数据集(DS_clim 和 DS_yield),我想比较它们的三个维度(时间、纬度、经度)。但是,它们的尺寸并不完全相同,因此我想到使用 xr.dataarray.where
到 mask/crop 两者,因此具有完全相同的尺寸。有趣的是,输出仍然不兼容,DS_yield 的数据点比 DS_clim 多。如果有人可以帮助我使它们在尺寸方面相同,我将不胜感激。我上传了两个 .nc 文件,您可以在下面找到一段应该复制它的独立代码。
干杯!
Link 用于下载两个文件:https://drive.google.com/file/d/1gDSoKOY6eFLHqZ4AM0TTr4tXEBu3Y6yM/view?usp=sharing
https://drive.google.com/file/d/1ysLqxNz-FBykJS2KojAx0UgTy6Hd9Wc2/view?usp=sharing
import xarray as xr
import pandas as pd
DS_clim = xr.open_dataset('ds_clim.nc')
DS_yield = xr.open_dataset('ds_yield.nc')
DS_clim = DS_clim.where(DS_yield['Yield'] >= 0.0 ) # Remove any grid points not present in the DS_yield
DS_yield = DS_yield.where(DS_clim['mask'] == 1.0 ) # Remove any grid points not present in the DS_clim
df_clim = DS_clim.to_dataframe().dropna()
df_yield = DS_yield.to_dataframe().dropna()
if len( df_clim) == len(df_yield):
print('Dimensions are equal')
else:
print('Dimensions are not equal')
编辑:DS_yield 和 DS_clim 输出是:
DS_clim
Out[180]:
<xarray.Dataset>
Dimensions: (lat: 70, lon: 84, time: 36)
Coordinates:
* lat (lat) float64 -34.75 -34.25 -33.75 -33.25 ... -1.25 -0.75 -0.25
* lon (lon) float64 -75.75 -75.25 -74.75 -74.25 ... -35.25 -34.75 -34.25
* time (time) int64 1981 1982 1983 1984 1985 ... 2012 2013 2014 2015 2016
Data variables:
DTR (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
ETR (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
PRCPTOT (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
R10mm (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
R20mm (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
Rx1day (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
Rx5day (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
SU (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TN10p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TN90p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TNn (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TNx (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TR (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TX10p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TX90p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TXn (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TXx (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
mask (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
DS_yield
Out[181]:
<xarray.Dataset>
Dimensions: (lat: 70, lon: 84, time: 36)
Coordinates:
* lat (lat) float64 -34.75 -34.25 -33.75 -33.25 ... -1.25 -0.75 -0.25
* lon (lon) float64 -75.75 -75.25 -74.75 -74.25 ... -35.25 -34.75 -34.25
* time (time) int32 1981 1982 1983 1984 1985 ... 2012 2013 2014 2015 2016
Data variables:
Yield (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
两个数据帧的输出是:
df_clim
Out[183]:
DTR ETR ... TXx mask
lat lon time ...
-33.25 -53.25 1981 10.103154 22.591901 ... 34.204458 1.0
1982 10.723433 23.566873 ... 34.711117 1.0
1983 9.179805 20.937945 ... 34.776137 1.0
1984 9.174395 21.326026 ... 34.636377 1.0
1985 11.931539 23.326610 ... 35.499480 1.0
... ... ... ... ...
-22.75 -51.25 2012 11.331343 18.377294 ... 33.616045 1.0
2013 10.325607 17.657545 ... 32.605069 1.0
2014 10.945801 18.699326 ... 35.043913 1.0
2015 10.226426 16.594986 ... 33.634570 1.0
2016 9.322276 16.398513 ... 33.411968 1.0
[5853 rows x 18 columns]
df_yield
Out[184]:
Yield
lat lon time
-33.25 -53.25 1981 1.687200
1982 1.669250
1983 1.532300
1984 1.133350
1985 1.215400
...
-22.75 -51.25 2012 2.369826
2013 2.773502
2014 1.373870
2015 2.901679
2016 2.220938
[5875 rows x 1 columns]
如您所见,每个数据框中的行数不同,这意味着它们并不完全相同。
您可以简单地使用索引的交集:
df_clim = DS_clim.to_dataframe()
df_yield = DS_yield.to_dataframe()
common_idx = df_clim.index.intersection(df_yield.index)
df_clim = df_clim.loc[common_idx]
df_yield = df_yield.loc[common_idx]
我遇到了这个简单的问题,但我还没有找到解决方法。我有两个数据集(DS_clim 和 DS_yield),我想比较它们的三个维度(时间、纬度、经度)。但是,它们的尺寸并不完全相同,因此我想到使用 xr.dataarray.where
到 mask/crop 两者,因此具有完全相同的尺寸。有趣的是,输出仍然不兼容,DS_yield 的数据点比 DS_clim 多。如果有人可以帮助我使它们在尺寸方面相同,我将不胜感激。我上传了两个 .nc 文件,您可以在下面找到一段应该复制它的独立代码。
干杯!
Link 用于下载两个文件:https://drive.google.com/file/d/1gDSoKOY6eFLHqZ4AM0TTr4tXEBu3Y6yM/view?usp=sharing https://drive.google.com/file/d/1ysLqxNz-FBykJS2KojAx0UgTy6Hd9Wc2/view?usp=sharing
import xarray as xr
import pandas as pd
DS_clim = xr.open_dataset('ds_clim.nc')
DS_yield = xr.open_dataset('ds_yield.nc')
DS_clim = DS_clim.where(DS_yield['Yield'] >= 0.0 ) # Remove any grid points not present in the DS_yield
DS_yield = DS_yield.where(DS_clim['mask'] == 1.0 ) # Remove any grid points not present in the DS_clim
df_clim = DS_clim.to_dataframe().dropna()
df_yield = DS_yield.to_dataframe().dropna()
if len( df_clim) == len(df_yield):
print('Dimensions are equal')
else:
print('Dimensions are not equal')
编辑:DS_yield 和 DS_clim 输出是:
DS_clim
Out[180]:
<xarray.Dataset>
Dimensions: (lat: 70, lon: 84, time: 36)
Coordinates:
* lat (lat) float64 -34.75 -34.25 -33.75 -33.25 ... -1.25 -0.75 -0.25
* lon (lon) float64 -75.75 -75.25 -74.75 -74.25 ... -35.25 -34.75 -34.25
* time (time) int64 1981 1982 1983 1984 1985 ... 2012 2013 2014 2015 2016
Data variables:
DTR (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
ETR (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
PRCPTOT (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
R10mm (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
R20mm (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
Rx1day (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
Rx5day (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
SU (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TN10p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TN90p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TNn (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TNx (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TR (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TX10p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TX90p (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TXn (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
TXx (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
mask (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
DS_yield
Out[181]:
<xarray.Dataset>
Dimensions: (lat: 70, lon: 84, time: 36)
Coordinates:
* lat (lat) float64 -34.75 -34.25 -33.75 -33.25 ... -1.25 -0.75 -0.25
* lon (lon) float64 -75.75 -75.25 -74.75 -74.25 ... -35.25 -34.75 -34.25
* time (time) int32 1981 1982 1983 1984 1985 ... 2012 2013 2014 2015 2016
Data variables:
Yield (time, lat, lon) float64 nan nan nan nan nan ... nan nan nan nan
两个数据帧的输出是:
df_clim
Out[183]:
DTR ETR ... TXx mask
lat lon time ...
-33.25 -53.25 1981 10.103154 22.591901 ... 34.204458 1.0
1982 10.723433 23.566873 ... 34.711117 1.0
1983 9.179805 20.937945 ... 34.776137 1.0
1984 9.174395 21.326026 ... 34.636377 1.0
1985 11.931539 23.326610 ... 35.499480 1.0
... ... ... ... ...
-22.75 -51.25 2012 11.331343 18.377294 ... 33.616045 1.0
2013 10.325607 17.657545 ... 32.605069 1.0
2014 10.945801 18.699326 ... 35.043913 1.0
2015 10.226426 16.594986 ... 33.634570 1.0
2016 9.322276 16.398513 ... 33.411968 1.0
[5853 rows x 18 columns]
df_yield
Out[184]:
Yield
lat lon time
-33.25 -53.25 1981 1.687200
1982 1.669250
1983 1.532300
1984 1.133350
1985 1.215400
...
-22.75 -51.25 2012 2.369826
2013 2.773502
2014 1.373870
2015 2.901679
2016 2.220938
[5875 rows x 1 columns]
如您所见,每个数据框中的行数不同,这意味着它们并不完全相同。
您可以简单地使用索引的交集:
df_clim = DS_clim.to_dataframe()
df_yield = DS_yield.to_dataframe()
common_idx = df_clim.index.intersection(df_yield.index)
df_clim = df_clim.loc[common_idx]
df_yield = df_yield.loc[common_idx]