@@ -323,18 +323,51 @@ def test_datetime_mean(dask: bool) -> None:
323
323
324
324
325
325
@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
+
327
331
times = cftime_range ("2000" , periods = 4 )
328
332
da = DataArray (times , dims = ["time" ])
333
+ da_2d = DataArray (times .values .reshape (2 , 2 ))
329
334
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 )
331
345
332
346
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 )
334
350
assert_equal (result , expected )
335
351
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" )
338
371
assert_equal (result , expected )
339
372
340
373
@@ -372,15 +405,6 @@ def test_cftime_datetime_mean_long_time_period():
372
405
assert_equal (result , expected )
373
406
374
407
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
-
384
408
def test_empty_axis_dtype ():
385
409
ds = Dataset ()
386
410
ds ["pos" ] = [1 , 2 , 3 ]
@@ -742,6 +766,17 @@ def test_datetime_to_numeric_cftime(dask):
742
766
expected = 24 * np .arange (0 , 35 , 7 ).astype (dtype )
743
767
np .testing .assert_array_equal (result , expected )
744
768
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
+
745
780
746
781
@requires_cftime
747
782
def test_datetime_to_numeric_potential_overflow ():
0 commit comments