@@ -323,18 +323,51 @@ def test_datetime_mean(dask: bool) -> None:
323323
324324
325325@requires_cftime
326- def test_cftime_datetime_mean ():
326+ @pytest .mark .parametrize ("dask" , [False , True ])
327+ def test_cftime_datetime_mean (dask ):
328+ if dask and not has_dask :
329+ pytest .skip ("requires dask" )
330+
327331 times = cftime_range ("2000" , periods = 4 )
328332 da = DataArray (times , dims = ["time" ])
333+ da_2d = DataArray (times .values .reshape (2 , 2 ))
329334
330- assert da .isel (time = 0 ).mean () == da .isel (time = 0 )
335+ if dask :
336+ da = da .chunk ({"time" : 2 })
337+ da_2d = da_2d .chunk ({"dim_0" : 2 })
338+
339+ expected = da .isel (time = 0 )
340+ # one compute needed to check the array contains cftime datetimes
341+ with raise_if_dask_computes (max_computes = 1 ):
342+ result = da .isel (time = 0 ).mean ()
343+ assert_dask_array (result , dask )
344+ assert_equal (result , expected )
331345
332346 expected = DataArray (times .date_type (2000 , 1 , 2 , 12 ))
333- result = da .mean ()
347+ with raise_if_dask_computes (max_computes = 1 ):
348+ result = da .mean ()
349+ assert_dask_array (result , dask )
334350 assert_equal (result , expected )
335351
336- da_2d = DataArray (times .values .reshape (2 , 2 ))
337- result = da_2d .mean ()
352+ with raise_if_dask_computes (max_computes = 1 ):
353+ result = da_2d .mean ()
354+ assert_dask_array (result , dask )
355+ assert_equal (result , expected )
356+
357+
358+ @requires_cftime
359+ @requires_dask
360+ def test_mean_over_non_time_dim_of_dataset_with_dask_backed_cftime_data ():
361+ # Regression test for part two of GH issue 5897: averaging over a non-time
362+ # dimension still fails if the time variable is dask-backed.
363+ ds = Dataset (
364+ {
365+ "var1" : (("time" ,), cftime_range ("2021-10-31" , periods = 10 , freq = "D" )),
366+ "var2" : (("x" ,), list (range (10 ))),
367+ }
368+ )
369+ expected = ds .mean ("x" )
370+ result = ds .chunk ({}).mean ("x" )
338371 assert_equal (result , expected )
339372
340373
@@ -372,15 +405,6 @@ def test_cftime_datetime_mean_long_time_period():
372405 assert_equal (result , expected )
373406
374407
375- @requires_cftime
376- @requires_dask
377- def test_cftime_datetime_mean_dask_error ():
378- times = cftime_range ("2000" , periods = 4 )
379- da = DataArray (times , dims = ["time" ]).chunk ()
380- with pytest .raises (NotImplementedError ):
381- da .mean ()
382-
383-
384408def test_empty_axis_dtype ():
385409 ds = Dataset ()
386410 ds ["pos" ] = [1 , 2 , 3 ]
@@ -742,6 +766,17 @@ def test_datetime_to_numeric_cftime(dask):
742766 expected = 24 * np .arange (0 , 35 , 7 ).astype (dtype )
743767 np .testing .assert_array_equal (result , expected )
744768
769+ with raise_if_dask_computes ():
770+ if dask :
771+ time = dask .array .asarray (times [1 ])
772+ else :
773+ time = np .asarray (times [1 ])
774+ result = duck_array_ops .datetime_to_numeric (
775+ time , offset = times [0 ], datetime_unit = "h" , dtype = int
776+ )
777+ expected = np .array (24 * 7 ).astype (int )
778+ np .testing .assert_array_equal (result , expected )
779+
745780
746781@requires_cftime
747782def test_datetime_to_numeric_potential_overflow ():
0 commit comments