From: Debian Science Team Date: Wed, 26 Aug 2020 21:34:50 +0000 (+0100) Subject: Xfail NaN <-> NaT tests on non-x86 and warn on cast X-Git-Tag: archive/raspbian/1.0.5+dfsg-3+rpi1^2~26 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2b18f72b99cac654d115f16da65d27f6d8b7707b;p=pandas.git Xfail NaN <-> NaT tests on non-x86 and warn on cast pd.Series([np.nan]).astype('datetime64[ns]')[0] = pd.NaT on x86 but 1970-01-01 on arm* because float NaN -> int is undefined: https://github.com/numpy/numpy/issues/8325 https://github.com/pandas-dev/pandas/issues/17792 https://github.com/pandas-dev/pandas/issues/26964 On s390x it's the maximum _positive_ value (2**63-1 ns = year 2262) Author: Andreas Tille , Graham Inggs , Rebecca N. Palmer Bug-Debian: https://bugs.debian.org/877754 Forwarded: no Gbp-Pq: Name xfail_tests_nonintel_nannat.patch --- diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index d4b60ec1..1e13b603 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -1,6 +1,10 @@ """ routings for casting """ from datetime import datetime, timedelta +import warnings +import platform +import re +warn_nannat_platform = "Non-x86 system detected, float -> datetime/timedelta may not handle NaNs correctly - https://bugs.debian.org/877754" if not bool(re.match('i.?86|x86',platform.uname()[4])) else False import numpy as np @@ -891,6 +895,8 @@ def astype_nansafe(arr, dtype, copy: bool = True, skipna: bool = False): f"'{dtype.name}[ns]' instead." ) raise ValueError(msg) + if warn_nannat_platform and (is_datetime64_dtype(dtype) or is_timedelta64_dtype(dtype)) and np.issubdtype(arr.dtype, np.floating) and not np.isfinite(arr).all(): + warnings.warn(warn_nannat_platform) if copy or is_object_dtype(arr) or is_object_dtype(dtype): # Explicit copy, or required since NumPy can't view from / to object. @@ -1263,6 +1269,8 @@ def maybe_cast_to_datetime(value, dtype, errors: str = "raise"): value = iNaT else: value = np.array(value, copy=False) + if warn_nannat_platform and np.issubdtype(value.dtype, np.floating) and not np.isfinite(value).all(): + warnings.warn(warn_nannat_platform) # have a scalar array-like (e.g. NaT) if value.ndim == 0: diff --git a/pandas/tests/dtypes/cast/test_downcast.py b/pandas/tests/dtypes/cast/test_downcast.py index d6e6ed30..0bfe74af 100644 --- a/pandas/tests/dtypes/cast/test_downcast.py +++ b/pandas/tests/dtypes/cast/test_downcast.py @@ -7,6 +7,9 @@ from pandas.core.dtypes.cast import maybe_downcast_to_dtype from pandas import DatetimeIndex, Series, Timestamp import pandas._testing as tm +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86',platform.uname()[4])) @pytest.mark.parametrize( @@ -77,6 +80,7 @@ def test_downcast_conversion_empty(any_real_dtype): tm.assert_numpy_array_equal(result, np.array([], dtype=np.int64)) +@pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) @pytest.mark.parametrize("klass", [np.datetime64, np.timedelta64]) def test_datetime_likes_nan(klass): dtype = klass.__name__ + "[ns]" diff --git a/pandas/tests/frame/indexing/test_where.py b/pandas/tests/frame/indexing/test_where.py index df1b128d..76fc7bee 100644 --- a/pandas/tests/frame/indexing/test_where.py +++ b/pandas/tests/frame/indexing/test_where.py @@ -8,6 +8,9 @@ from pandas.core.dtypes.common import is_scalar import pandas as pd from pandas import DataFrame, DatetimeIndex, Series, Timestamp, date_range, isna import pandas._testing as tm +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86|s390|ppc',platform.uname()[4])) class TestDataFrameIndexingWhere: @@ -340,6 +343,7 @@ class TestDataFrameIndexingWhere: result = a.where(do_not_replace, b) tm.assert_frame_equal(result, expected) + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False)#not found def test_where_datetime(self): # GH 3311 diff --git a/pandas/tests/frame/test_analytics.py b/pandas/tests/frame/test_analytics.py index 8e1c3eff..981f98c6 100644 --- a/pandas/tests/frame/test_analytics.py +++ b/pandas/tests/frame/test_analytics.py @@ -23,6 +23,9 @@ from pandas import ( import pandas._testing as tm import pandas.core.algorithms as algorithms import pandas.core.nanops as nanops +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86|s390|ppc',platform.uname()[4])) def assert_stat_op_calc( @@ -790,6 +793,7 @@ class TestDataFrameAnalytics: expected = pd.Series(result, index=["A", "B"]) tm.assert_series_equal(result, expected) + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) def test_sum_nanops_timedelta(self): # prod isn't defined on timedeltas idx = ["a", "b", "c"] diff --git a/pandas/tests/indexes/datetimes/test_datetime.py b/pandas/tests/indexes/datetimes/test_datetime.py index ca18d6fb..dbdf3ed9 100644 --- a/pandas/tests/indexes/datetimes/test_datetime.py +++ b/pandas/tests/indexes/datetimes/test_datetime.py @@ -7,6 +7,9 @@ import pytest import pandas as pd from pandas import DataFrame, DatetimeIndex, Index, Timestamp, date_range, offsets import pandas._testing as tm +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86|s390|ppc',platform.uname()[4])) randn = np.random.randn @@ -63,6 +66,7 @@ class TestDatetimeIndex: idx2 = pd.date_range(end="2000", periods=periods, freq="S") assert len(idx2) == periods + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) def test_nat(self): assert DatetimeIndex([np.nan])[0] is pd.NaT diff --git a/pandas/tests/reductions/test_reductions.py b/pandas/tests/reductions/test_reductions.py index 7400b049..b1e80cab 100644 --- a/pandas/tests/reductions/test_reductions.py +++ b/pandas/tests/reductions/test_reductions.py @@ -23,6 +23,9 @@ from pandas import ( ) import pandas._testing as tm from pandas.core import nanops +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86|s390|ppc',platform.uname()[4])) def get_objs(): @@ -1142,6 +1145,7 @@ class TestSeriesMode: expected = Series(expected2, dtype=object) tm.assert_series_equal(result, expected) + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) @pytest.mark.parametrize( "dropna, expected1, expected2", [ diff --git a/pandas/tests/series/test_constructors.py b/pandas/tests/series/test_constructors.py index c38e5708..dc0bbbce 100644 --- a/pandas/tests/series/test_constructors.py +++ b/pandas/tests/series/test_constructors.py @@ -28,7 +28,9 @@ from pandas import ( ) import pandas._testing as tm from pandas.core.arrays import IntervalArray, period_array - +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86|s390|ppc',platform.uname()[4])) class TestSeriesConstructors: @pytest.mark.parametrize( @@ -960,6 +962,7 @@ class TestSeriesConstructors: tm.assert_series_equal(result, expected) + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) @pytest.mark.parametrize("arg", ["2013-01-01 00:00:00", pd.NaT, np.nan, None]) def test_constructor_with_naive_string_and_datetimetz_dtype(self, arg): # GH 17415: With naive string @@ -1272,6 +1275,7 @@ class TestSeriesConstructors: series[2] = val assert isna(series[2]) + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) def test_NaT_cast(self): # GH10747 result = Series([np.nan]).astype("M8[ns]") diff --git a/pandas/tests/test_algos.py b/pandas/tests/test_algos.py index 57ee3bed..126f00cd 100644 --- a/pandas/tests/test_algos.py +++ b/pandas/tests/test_algos.py @@ -35,6 +35,9 @@ from pandas.conftest import BYTES_DTYPES, STRING_DTYPES import pandas.core.algorithms as algos from pandas.core.arrays import DatetimeArray import pandas.core.common as com +import platform +import re +is_nannat_working=bool(re.match('i.?86|x86|s390|ppc',platform.uname()[4])) class TestFactorize: @@ -1046,6 +1049,7 @@ class TestValueCounts: expected = Series([2, 1, 1], index=[5.0, 10.3, np.nan]) tm.assert_series_equal(result, expected) + @pytest.mark.xfail(condition=not is_nannat_working,reason="https://bugs.debian.org/877754",strict=False) def test_value_counts_normalized(self): # GH12558 s = Series([1, 2, np.nan, np.nan, np.nan])