如何解决屏蔽数据集以使 Xarray 中的维度相同使用 where 函数
我遇到了这个简单的问题,但我还没有找到解决方法。我有两个数据集(DS_clim 和 DS_yield),我想在三个维度(时间、纬度、经度)之间进行比较。但是,它们的尺寸并不完全相同,因此我想到使用 xr.dataarray.where
来屏蔽/裁剪它们,因此具有完全相同的尺寸。有趣的是,输出仍然不兼容,DS_yield 比 DS_clim 具有更多的数据点。如果有人可以帮助我使它们在尺寸方面相同,我将不胜感激。我上传了两个 .nc 文件,您可以在下面找到一段应该复制它的独立代码。
干杯!
下载两个文件的链接: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_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,lon) float64 nan nan nan nan nan ... nan nan nan nan
PRCPTOT (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
R10mm (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
R20mm (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
Rx1day (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
Rx5day (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
SU (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TN10p (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TN90p (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TNn (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TNx (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TR (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TX10p (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TX90p (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TXn (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
TXx (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
mask (time,lon) float64 nan nan nan nan nan ... nan nan nan nan
DS_yield
Out[181]:
<xarray.Dataset>
Dimensions: (lat: 70,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,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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。