@@ -451,10 +451,21 @@ def test_sel_date_scalar(da, date_type, index):
451451
452452
453453@pytest .mark .xfail (reason = "https://github.com/pydata/xarray/issues/3751" )
454+ @requires_cftime
455+ def test_sel_date_distant_date (da , date_type , index ):
456+ expected = xr .DataArray (4 ).assign_coords (time = index [3 ])
457+ result = da .sel (time = date_type (2000 , 1 , 1 ), method = "nearest" )
458+ assert_identical (result , expected )
459+
460+
454461@requires_cftime
455462@pytest .mark .parametrize (
456463 "sel_kwargs" ,
457- [{"method" : "nearest" }, {"method" : "nearest" , "tolerance" : timedelta (days = 70 )}],
464+ [
465+ {"method" : "nearest" },
466+ {"method" : "nearest" , "tolerance" : timedelta (days = 70 )},
467+ {"method" : "nearest" , "tolerance" : timedelta (days = 1800000 )},
468+ ],
458469)
459470def test_sel_date_scalar_nearest (da , date_type , index , sel_kwargs ):
460471 expected = xr .DataArray (2 ).assign_coords (time = index [1 ])
@@ -738,7 +749,7 @@ def test_timedeltaindex_add_cftimeindex(calendar):
738749
739750
740751@requires_cftime
741- def test_cftimeindex_sub (index ):
752+ def test_cftimeindex_sub_timedelta (index ):
742753 date_type = index .date_type
743754 expected_dates = [
744755 date_type (1 , 1 , 2 ),
@@ -753,6 +764,27 @@ def test_cftimeindex_sub(index):
753764 assert isinstance (result , CFTimeIndex )
754765
755766
767+ @requires_cftime
768+ @pytest .mark .parametrize (
769+ "other" ,
770+ [np .array (4 * [timedelta (days = 1 )]), np .array (timedelta (days = 1 ))],
771+ ids = ["1d-array" , "scalar-array" ],
772+ )
773+ def test_cftimeindex_sub_timedelta_array (index , other ):
774+ date_type = index .date_type
775+ expected_dates = [
776+ date_type (1 , 1 , 2 ),
777+ date_type (1 , 2 , 2 ),
778+ date_type (2 , 1 , 2 ),
779+ date_type (2 , 2 , 2 ),
780+ ]
781+ expected = CFTimeIndex (expected_dates )
782+ result = index + timedelta (days = 2 )
783+ result = result - other
784+ assert result .equals (expected )
785+ assert isinstance (result , CFTimeIndex )
786+
787+
756788@requires_cftime
757789@pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
758790def test_cftimeindex_sub_cftimeindex (calendar ):
@@ -784,6 +816,14 @@ def test_cftime_datetime_sub_cftimeindex(calendar):
784816 assert isinstance (result , pd .TimedeltaIndex )
785817
786818
819+ @requires_cftime
820+ @pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
821+ def test_distant_cftime_datetime_sub_cftimeindex (calendar ):
822+ a = xr .cftime_range ("2000" , periods = 5 , calendar = calendar )
823+ with pytest .raises (ValueError , match = "difference exceeds" ):
824+ a .date_type (1 , 1 , 1 ) - a
825+
826+
787827@requires_cftime
788828@pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
789829def test_cftimeindex_sub_timedeltaindex (calendar ):
@@ -795,6 +835,25 @@ def test_cftimeindex_sub_timedeltaindex(calendar):
795835 assert isinstance (result , CFTimeIndex )
796836
797837
838+ @requires_cftime
839+ @pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
840+ def test_cftimeindex_sub_index_of_cftime_datetimes (calendar ):
841+ a = xr .cftime_range ("2000" , periods = 5 , calendar = calendar )
842+ b = pd .Index (a .values )
843+ expected = a - a
844+ result = a - b
845+ assert result .equals (expected )
846+ assert isinstance (result , pd .TimedeltaIndex )
847+
848+
849+ @requires_cftime
850+ @pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
851+ def test_cftimeindex_sub_not_implemented (calendar ):
852+ a = xr .cftime_range ("2000" , periods = 5 , calendar = calendar )
853+ with pytest .raises (TypeError , match = "unsupported operand" ):
854+ a - 1
855+
856+
798857@requires_cftime
799858def test_cftimeindex_rsub (index ):
800859 with pytest .raises (TypeError ):
0 commit comments