@@ -451,10 +451,21 @@ def test_sel_date_scalar(da, date_type, index):
451
451
452
452
453
453
@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
+
454
461
@requires_cftime
455
462
@pytest .mark .parametrize (
456
463
"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
+ ],
458
469
)
459
470
def test_sel_date_scalar_nearest (da , date_type , index , sel_kwargs ):
460
471
expected = xr .DataArray (2 ).assign_coords (time = index [1 ])
@@ -738,7 +749,7 @@ def test_timedeltaindex_add_cftimeindex(calendar):
738
749
739
750
740
751
@requires_cftime
741
- def test_cftimeindex_sub (index ):
752
+ def test_cftimeindex_sub_timedelta (index ):
742
753
date_type = index .date_type
743
754
expected_dates = [
744
755
date_type (1 , 1 , 2 ),
@@ -753,6 +764,27 @@ def test_cftimeindex_sub(index):
753
764
assert isinstance (result , CFTimeIndex )
754
765
755
766
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
+
756
788
@requires_cftime
757
789
@pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
758
790
def test_cftimeindex_sub_cftimeindex (calendar ):
@@ -784,6 +816,14 @@ def test_cftime_datetime_sub_cftimeindex(calendar):
784
816
assert isinstance (result , pd .TimedeltaIndex )
785
817
786
818
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
+
787
827
@requires_cftime
788
828
@pytest .mark .parametrize ("calendar" , _CFTIME_CALENDARS )
789
829
def test_cftimeindex_sub_timedeltaindex (calendar ):
@@ -795,6 +835,25 @@ def test_cftimeindex_sub_timedeltaindex(calendar):
795
835
assert isinstance (result , CFTimeIndex )
796
836
797
837
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
+
798
857
@requires_cftime
799
858
def test_cftimeindex_rsub (index ):
800
859
with pytest .raises (TypeError ):
0 commit comments