Python xarray-从另一个DataArray的时间标签中选择/索引DataArray

Python xarray-从另一个DataArray的时间标签中选择/索引DataArray,python,pandas,numpy,python-xarray,Python,Pandas,Numpy,Python Xarray,我有两个DataArray对象,分别称为“A”和“B” 除了纬度和经度,它们都有一个时间维度,表示每日数据A的时间坐标小于B A的时间维度: <xarray.DataArray 'time' (time: 1422)> array(['2015-03-30T00:00:00.000000000', '2015-06-14T00:00:00.000000000', '2015-06-16T00:00:00.000000000', ..., '2019-08-31T00:0

我有两个DataArray对象,分别称为“
A
”和“
B

除了
纬度
经度
,它们都有一个
时间
维度,表示每日数据
A
的时间坐标小于
B

A的时间维度:

<xarray.DataArray 'time' (time: 1422)>
array(['2015-03-30T00:00:00.000000000', '2015-06-14T00:00:00.000000000',
       '2015-06-16T00:00:00.000000000', ..., '2019-08-31T00:00:00.000000000',
       '2019-09-01T00:00:00.000000000', '2019-09-02T00:00:00.000000000'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 2015-03-30 2015-06-14 ... 2019-09-02
<xarray.DataArray 'time' (time: 16802)>
array(['1972-01-01T00:00:00.000000000', '1972-01-02T00:00:00.000000000',
       '1972-01-03T00:00:00.000000000', ..., '2017-12-29T00:00:00.000000000',
       '2017-12-30T00:00:00.000000000', '2017-12-31T00:00:00.000000000'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1972-01-01 1972-01-02 ... 2017-12-31
我收到一个错误:
KeyError:“不是在索引“time”中找到的所有值”

显然,A的时间维度是B的时间维度的子集

我收到一个错误:KeyError:“不是在索引'time'中找到的所有值”

错误消息本身暗示语句1中的假设是错误的。此外,如果仔细查看时间值,
A
的值将持续到2019年,而
B
的值将在2017年结束

因此,有两种方法可以解决这个问题:

  • 如果您确定A在2017年之前拥有B中的所有值,那么

    sel_dates = A.time.values[A.time.dt.year < 2017]
    B_sel = B.sel(time=sel_dates)
    

  • 在这种情况下,我认为每一行可读且清晰的解释,直接用英语散文,可能会让你投赞成票……;-)
    sel_dates = A.time.values[A.time.dt.year < 2017]
    B_sel = B.sel(time=sel_dates)
    
    sel_dates = A.time.values[np.isin(A.time.values, B.time.values)]
    
     ## example ##
     ## dates1 is an array of daily dates of 1 month
     dates1 = np.arange('2005-02', '2005-03', dtype='datetime64[D]')
     dates2 = np.array(['2005-02-03', '2002-02-05', '2000-01-05'], dtype='datetime64')
     # checking for dates2 which are a part of dates 1
     print(np.isin(dates2, dates1))
     >>array([ True, False, False])
    
    A_new = A.where(A.time.isin(B.time), drop=True)