@@ -1825,67 +1825,49 @@ def test_encode_cf_timedelta_small_dtype_missing_value(use_dask) -> None:
18251825
18261826
18271827_DECODE_TIMEDELTA_VIA_UNITS_TESTS = {
1828- "default" : (True , None , np .dtype ("timedelta64[ns]" ), True ),
1829- "decode_timedelta=True" : (True , True , np .dtype ("timedelta64[ns]" ), False ),
1830- "decode_timedelta=False" : (True , False , np .dtype ("int64" ), False ),
1831- "inherit-time_unit-from-decode_times" : (
1832- CFDatetimeCoder (time_unit = "s" ),
1833- None ,
1834- np .dtype ("timedelta64[s]" ),
1835- True ,
1836- ),
1828+ "default" : (True , None , np .dtype ("int64" )),
1829+ "decode_timedelta=True" : (True , True , np .dtype ("timedelta64[ns]" )),
1830+ "decode_timedelta=False" : (True , False , np .dtype ("int64" )),
18371831 "set-time_unit-via-CFTimedeltaCoder-decode_times=True" : (
18381832 True ,
1839- CFTimedeltaCoder (time_unit = "s" ),
1833+ CFTimedeltaCoder (decode_via_units = True , time_unit = "s" ),
18401834 np .dtype ("timedelta64[s]" ),
1841- False ,
18421835 ),
18431836 "set-time_unit-via-CFTimedeltaCoder-decode_times=False" : (
18441837 False ,
1845- CFTimedeltaCoder (time_unit = "s" ),
1838+ CFTimedeltaCoder (decode_via_units = True , time_unit = "s" ),
18461839 np .dtype ("timedelta64[s]" ),
1847- False ,
18481840 ),
18491841 "override-time_unit-from-decode_times" : (
18501842 CFDatetimeCoder (time_unit = "ns" ),
1851- CFTimedeltaCoder (time_unit = "s" ),
1843+ CFTimedeltaCoder (decode_via_units = True , time_unit = "s" ),
18521844 np .dtype ("timedelta64[s]" ),
1853- False ,
18541845 ),
18551846}
18561847
18571848
18581849@pytest .mark .parametrize (
1859- ("decode_times" , "decode_timedelta" , "expected_dtype" , "warns" ),
1850+ ("decode_times" , "decode_timedelta" , "expected_dtype" ),
18601851 list (_DECODE_TIMEDELTA_VIA_UNITS_TESTS .values ()),
18611852 ids = list (_DECODE_TIMEDELTA_VIA_UNITS_TESTS .keys ()),
18621853)
18631854def test_decode_timedelta_via_units (
1864- decode_times , decode_timedelta , expected_dtype , warns
1855+ decode_times , decode_timedelta , expected_dtype
18651856) -> None :
18661857 timedeltas = pd .timedelta_range (0 , freq = "D" , periods = 3 )
18671858 attrs = {"units" : "days" }
18681859 var = Variable (["time" ], timedeltas , encoding = attrs )
18691860 encoded = Variable (["time" ], np .array ([0 , 1 , 2 ]), attrs = attrs )
1870- if warns :
1871- with pytest .warns (
1872- FutureWarning ,
1873- match = "xarray will not decode the variable 'foo' into a timedelta64 dtype" ,
1874- ):
1875- decoded = conventions .decode_cf_variable (
1876- "foo" ,
1877- encoded ,
1878- decode_times = decode_times ,
1879- decode_timedelta = decode_timedelta ,
1880- )
1861+ decoded = conventions .decode_cf_variable (
1862+ "foo" , encoded , decode_times = decode_times , decode_timedelta = decode_timedelta
1863+ )
1864+ if decode_timedelta is True or (
1865+ isinstance (decode_timedelta , CFTimedeltaCoder )
1866+ and decode_timedelta .decode_via_units
1867+ ):
1868+ assert_equal (var , decoded )
18811869 else :
1882- decoded = conventions .decode_cf_variable (
1883- "foo" , encoded , decode_times = decode_times , decode_timedelta = decode_timedelta
1884- )
1885- if decode_timedelta is False :
18861870 assert_equal (encoded , decoded )
1887- else :
1888- assert_equal (var , decoded )
18891871 assert decoded .dtype == expected_dtype
18901872
18911873
@@ -1954,7 +1936,7 @@ def test_decode_timedelta_via_dtype(
19541936@pytest .mark .parametrize ("dtype" , [np .uint64 , np .int64 , np .float64 ])
19551937def test_decode_timedelta_dtypes (dtype ) -> None :
19561938 encoded = Variable (["time" ], np .arange (10 ), {"units" : "seconds" })
1957- coder = CFTimedeltaCoder (time_unit = "s" )
1939+ coder = CFTimedeltaCoder (decode_via_units = True , time_unit = "s" )
19581940 decoded = coder .decode (encoded )
19591941 assert decoded .dtype .kind == "m"
19601942 assert_equal (coder .encode (decoded ), encoded )
@@ -1963,8 +1945,9 @@ def test_decode_timedelta_dtypes(dtype) -> None:
19631945def test_lazy_decode_timedelta_unexpected_dtype () -> None :
19641946 attrs = {"units" : "seconds" }
19651947 encoded = Variable (["time" ], [0 , 0.5 , 1 ], attrs = attrs )
1948+ decode_timedelta = CFTimedeltaCoder (decode_via_units = True , time_unit = "s" )
19661949 decoded = conventions .decode_cf_variable (
1967- "foo" , encoded , decode_timedelta = CFTimedeltaCoder ( time_unit = "s" )
1950+ "foo" , encoded , decode_timedelta = decode_timedelta
19681951 )
19691952
19701953 expected_dtype_upon_lazy_decoding = np .dtype ("timedelta64[s]" )
@@ -1978,8 +1961,9 @@ def test_lazy_decode_timedelta_unexpected_dtype() -> None:
19781961def test_lazy_decode_timedelta_error () -> None :
19791962 attrs = {"units" : "seconds" }
19801963 encoded = Variable (["time" ], [0 , np .iinfo (np .int64 ).max , 1 ], attrs = attrs )
1964+ decode_timedelta = CFTimedeltaCoder (decode_via_units = True , time_unit = "ms" )
19811965 decoded = conventions .decode_cf_variable (
1982- "foo" , encoded , decode_timedelta = CFTimedeltaCoder ( time_unit = "ms" )
1966+ "foo" , encoded , decode_timedelta = decode_timedelta
19831967 )
19841968 with pytest .raises (OutOfBoundsTimedelta , match = "overflow" ):
19851969 decoded .load ()
0 commit comments