@@ -1189,3 +1189,88 @@ def test_interp_vectorized_shared_dims(chunk: bool) -> None:
11891189 coords = {"u" : [45 , 55 ], "t" : [10 , 12 ], "x" : dx , "y" : dy },
11901190 )
11911191 assert_identical (actual , expected )
1192+
1193+
1194+ @requires_scipy
1195+ def test_dataset_interp_datetime_variable () -> None :
1196+ # GH#10900
1197+ ds = xr .Dataset (
1198+ data_vars = {
1199+ "something" : (["x" , "y" ], np .arange (25 , dtype = float ).reshape (5 , 5 )),
1200+ "time" : (
1201+ ["x" , "y" ],
1202+ np .datetime64 ("2024-01-01" )
1203+ + np .arange (25 ).reshape (5 , 5 ) * np .timedelta64 (1 , "D" ),
1204+ ),
1205+ },
1206+ coords = {"x" : np .arange (5 ), "y" : np .arange (5 )},
1207+ )
1208+
1209+ result = ds .interp (x = [0.5 , 1.5 ], y = [0.5 , 1.5 ])
1210+
1211+ assert "time" in result .data_vars
1212+ expected_time = np .datetime64 ("2024-01-01" ) + np .timedelta64 (3 , "D" )
1213+ np .testing .assert_equal (result ["time" ].values [0 , 0 ], expected_time )
1214+
1215+
1216+ @requires_scipy
1217+ def test_dataset_interp_timedelta_variable () -> None :
1218+ # GH#10900
1219+ ds = xr .Dataset (
1220+ data_vars = {
1221+ "duration" : (["x" ], np .array ([1 , 2 , 3 , 4 , 5 ], dtype = "timedelta64[D]" )),
1222+ },
1223+ coords = {"x" : np .arange (5 )},
1224+ )
1225+
1226+ result = ds .interp (x = [0.5 , 1.5 , 2.5 ])
1227+
1228+ assert "duration" in result .data_vars
1229+ expected_seconds = np .array ([1.5 , 2.5 , 3.5 ]) * 86400
1230+ actual_seconds = result ["duration" ].values .astype ("timedelta64[s]" ).astype (float )
1231+ np .testing .assert_allclose (actual_seconds , expected_seconds , rtol = 1e-10 )
1232+
1233+
1234+ @requires_scipy
1235+ def test_dataset_interp_datetime_nat () -> None :
1236+ # GH#10900 - NaT propagates like NaN
1237+ time_data = np .array (
1238+ ["2024-01-01" , "2024-01-02" , "NaT" , "2024-01-04" , "2024-01-05" ],
1239+ dtype = "datetime64[D]" ,
1240+ )
1241+ ds = xr .Dataset (
1242+ data_vars = {"time" : (["x" ], time_data )},
1243+ coords = {"x" : np .arange (5 )},
1244+ )
1245+
1246+ result = ds .interp (x = [0.5 , 1.5 , 2.5 , 3.5 ])
1247+
1248+ assert not np .isnat (result ["time" ].values [0 ])
1249+ assert np .isnat (result ["time" ].values [1 ])
1250+ assert np .isnat (result ["time" ].values [2 ])
1251+ assert not np .isnat (result ["time" ].values [3 ])
1252+
1253+
1254+ @requires_scipy
1255+ @requires_dask
1256+ def test_dataset_interp_datetime_dask () -> None :
1257+ # GH#10900
1258+ ds = xr .Dataset (
1259+ data_vars = {
1260+ "something" : (["x" , "y" ], np .arange (25 , dtype = float ).reshape (5 , 5 )),
1261+ "time" : (
1262+ ["x" , "y" ],
1263+ np .datetime64 ("2024-01-01" )
1264+ + np .arange (25 ).reshape (5 , 5 ) * np .timedelta64 (1 , "D" ),
1265+ ),
1266+ },
1267+ coords = {"x" : np .arange (5 ), "y" : np .arange (5 )},
1268+ ).chunk ({"x" : 2 , "y" : 2 })
1269+
1270+ with raise_if_dask_computes ():
1271+ result = ds .interp (x = [0.5 , 1.5 ], y = [0.5 , 1.5 ])
1272+
1273+ assert "time" in result .data_vars
1274+ computed = result .compute ()
1275+ expected_time = np .datetime64 ("2024-01-01" ) + np .timedelta64 (3 , "D" )
1276+ np .testing .assert_equal (computed ["time" ].values [0 , 0 ], expected_time )
0 commit comments