@@ -878,6 +878,40 @@ def test_add_bounds_nd_variable() -> None:
878878 ds .cf .add_bounds ("z" ).cf .add_bounds ("x" )
879879
880880
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+
881915def test_bounds () -> None :
882916 ds = airds .copy (deep = False ).cf .add_bounds ("lat" )
883917
@@ -947,7 +981,7 @@ def test_bounds_to_vertices() -> None:
947981 with pytest .raises (ValueError ):
948982 dsv = dsb .cf .bounds_to_vertices ("T" )
949983
950- # Words on datetime arrays to
984+ # Works on datetime arrays to
951985 dsb = dsb .cf .add_bounds ("time" )
952986 dsv = dsb .cf .bounds_to_vertices ()
953987 assert "time_bounds" in dsv
0 commit comments