微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

屏蔽数据集以使 Xarray 中的维度相同使用 where 函数

如何解决屏蔽数据集以使 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_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,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 举报,一经查实,本站将立刻删除。