@@ -878,6 +878,40 @@ def test_add_bounds_nd_variable() -> None:
878
878
ds .cf .add_bounds ("z" ).cf .add_bounds ("x" )
879
879
880
880
881
+ def test_add_bounds_cftime () -> None :
882
+ ds = airds .copy (deep = False )
883
+ # Switch to cftime objects
884
+ time , time_units , time_calendar = xr .coding .times .encode_cf_datetime (ds ["time" ])
885
+ time_cftime = xr .coding .times .decode_cf_datetime (
886
+ time ,
887
+ units = time_units ,
888
+ calendar = time_calendar ,
889
+ use_cftime = True ,
890
+ )
891
+
892
+ ds ["time" ] = ("time" , time_cftime )
893
+
894
+ da_time = ds ["time" ]
895
+ # Resorting to loop as something casts things to numpy types which causes explosions
896
+ time_diffs = np .array (
897
+ [da_time .values [i + 1 ] - da_time .values [i ] for i in range (len (da_time ) - 1 )]
898
+ )
899
+
900
+ # `1:` indexing to mimic xarray's diff behaviour which drops the first value
901
+ lower = da_time .values [1 :] - time_diffs / 2
902
+ lower = np .concatenate ([[lower [0 ] - time_diffs [0 ]], lower ])
903
+ upper = da_time .values [1 :] + time_diffs / 2
904
+ upper = np .concatenate ([[upper [0 ] - time_diffs [0 ]], upper ])
905
+
906
+ lower = xr .DataArray (lower , dims = ["time" ], coords = da_time .coords )
907
+ upper = xr .DataArray (upper , dims = ["time" ], coords = da_time .coords )
908
+ expected = xr .concat ([lower , upper ], dim = "bounds" ).transpose (..., "bounds" )
909
+
910
+ ds .cf .add_bounds ("time" )
911
+ actual = ds .cf .add_bounds ("time" ).time_bounds .reset_coords (drop = True )
912
+ xr .testing .assert_identical (actual , expected )
913
+
914
+
881
915
def test_bounds () -> None :
882
916
ds = airds .copy (deep = False ).cf .add_bounds ("lat" )
883
917
@@ -947,7 +981,7 @@ def test_bounds_to_vertices() -> None:
947
981
with pytest .raises (ValueError ):
948
982
dsv = dsb .cf .bounds_to_vertices ("T" )
949
983
950
- # Words on datetime arrays to
984
+ # Works on datetime arrays to
951
985
dsb = dsb .cf .add_bounds ("time" )
952
986
dsv = dsb .cf .bounds_to_vertices ()
953
987
assert "time_bounds" in dsv
0 commit comments