diff --git a/narwhals/_arrow/series_dt.py b/narwhals/_arrow/series_dt.py index 3ba677523c..6b45a0faf5 100644 --- a/narwhals/_arrow/series_dt.py +++ b/narwhals/_arrow/series_dt.py @@ -9,7 +9,6 @@ from narwhals._arrow.utils import floordiv_compat from narwhals._arrow.utils import lit from narwhals.utils import import_dtypes_module -from narwhals.utils import isinstance_or_issubclass if TYPE_CHECKING: from typing_extensions import Self @@ -52,7 +51,7 @@ def convert_time_zone(self: Self, time_zone: str) -> ArrowSeries: def timestamp(self: Self, time_unit: TimeUnit) -> ArrowSeries: ser: ArrowSeries = self._compliant_series dtypes = import_dtypes_module(ser._version) - if isinstance_or_issubclass(ser.dtype, dtypes.Datetime): + if isinstance(ser.dtype, dtypes.Datetime): unit = ser.dtype.time_unit s_cast = ser._native_series.cast(pa.int64()) if unit == "ns": @@ -86,7 +85,7 @@ def timestamp(self: Self, time_unit: TimeUnit) -> ArrowSeries: else: # pragma: no cover msg = f"unexpected time unit {unit}, please report an issue at https://github.com/narwhals-dev/narwhals" raise AssertionError(msg) - elif isinstance_or_issubclass(ser.dtype, dtypes.Date): + elif isinstance(ser.dtype, dtypes.Date): time_s = pc.multiply(ser._native_series.cast(pa.int32()), 86400) if time_unit == "ns": result = cast("ArrowChunkedArray", pc.multiply(time_s, 1_000_000_000)) diff --git a/narwhals/_dask/expr_dt.py b/narwhals/_dask/expr_dt.py index 330933bc8a..c569d7dc5b 100644 --- a/narwhals/_dask/expr_dt.py +++ b/narwhals/_dask/expr_dt.py @@ -114,8 +114,8 @@ def func(s: dx.Series, time_unit: TimeUnit) -> dx.Series: # Date is only supported in pandas dtypes if pyarrow-backed s_cast = s.astype("Int32[pyarrow]") result = calculate_timestamp_date(s_cast, time_unit) - elif dtype == dtypes.Datetime: - original_time_unit = dtype.time_unit # type: ignore[attr-defined] + elif isinstance(dtype, dtypes.Datetime): + original_time_unit = dtype.time_unit s_cast = ( s.astype("Int64[pyarrow]") if is_pyarrow_dtype else s.astype("int64") ) diff --git a/narwhals/_pandas_like/series.py b/narwhals/_pandas_like/series.py index c45bd6aac7..ee07aa2671 100644 --- a/narwhals/_pandas_like/series.py +++ b/narwhals/_pandas_like/series.py @@ -656,7 +656,7 @@ def to_numpy(self: Self, dtype: Any = None, copy: bool | None = None) -> _1DArra # https://numpy.org/doc/stable/reference/generated/numpy.ndarray.__array__.html copy = copy or self._implementation is Implementation.CUDF dtypes = import_dtypes_module(self._version) - if self.dtype == dtypes.Datetime and self.dtype.time_zone is not None: # type: ignore[attr-defined] + if isinstance(self.dtype, dtypes.Datetime) and self.dtype.time_zone is not None: s = self.dt.convert_time_zone("UTC").dt.replace_time_zone(None)._native_series else: s = self._native_series diff --git a/narwhals/_pandas_like/series_dt.py b/narwhals/_pandas_like/series_dt.py index bbebbc6b78..c16be61abf 100644 --- a/narwhals/_pandas_like/series_dt.py +++ b/narwhals/_pandas_like/series_dt.py @@ -218,8 +218,8 @@ def timestamp(self: Self, time_unit: TimeUnit) -> PandasLikeSeries: # Date is only supported in pandas dtypes if pyarrow-backed s_cast = s.astype("Int32[pyarrow]") result = calculate_timestamp_date(s_cast, time_unit) - elif dtype == dtypes.Datetime: - original_time_unit = dtype.time_unit # type: ignore[attr-defined] + elif isinstance(dtype, dtypes.Datetime): + original_time_unit = dtype.time_unit if ( self._compliant_series._implementation is Implementation.PANDAS and self._compliant_series._backend_version < (2,) diff --git a/narwhals/utils.py b/narwhals/utils.py index cb33a603d6..d623b7dd29 100644 --- a/narwhals/utils.py +++ b/narwhals/utils.py @@ -1294,11 +1294,11 @@ def dtype_matches_time_unit_and_time_zone( dtype: DType, dtypes: DTypes, time_units: Set[TimeUnit], time_zones: Set[str | None] ) -> bool: return ( - (dtype == dtypes.Datetime) - and (dtype.time_unit in time_units) # type: ignore[attr-defined] + isinstance(dtype, dtypes.Datetime) + and (dtype.time_unit in time_units) and ( - dtype.time_zone in time_zones # type: ignore[attr-defined] - or ("*" in time_zones and dtype.time_zone is not None) # type: ignore[attr-defined] + dtype.time_zone in time_zones + or ("*" in time_zones and dtype.time_zone is not None) ) ) diff --git a/tests/expr_and_series/dt/convert_time_zone_test.py b/tests/expr_and_series/dt/convert_time_zone_test.py index 9a18ee07fb..9effb17e3a 100644 --- a/tests/expr_and_series/dt/convert_time_zone_test.py +++ b/tests/expr_and_series/dt/convert_time_zone_test.py @@ -42,7 +42,8 @@ def test_convert_time_zone( result = df.select(nw.col("a").dt.convert_time_zone("Asia/Kathmandu")) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone == "Asia/Kathmandu" # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone == "Asia/Kathmandu" result_str = result.select(nw.col("a").dt.to_string("%Y-%m-%dT%H:%M%z")) expected = {"a": ["2020-01-01T05:45+0545", "2020-01-02T05:45+0545"]} assert_equal_data(result_str, expected) @@ -70,7 +71,8 @@ def test_convert_time_zone_series( result = df.select(df["a"].dt.convert_time_zone("Asia/Kathmandu")) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone == "Asia/Kathmandu" # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone == "Asia/Kathmandu" result_str = result.select(nw.col("a").dt.to_string("%Y-%m-%dT%H:%M%z")) expected = {"a": ["2020-01-01T05:45+0545", "2020-01-02T05:45+0545"]} assert_equal_data(result_str, expected) @@ -105,7 +107,8 @@ def test_convert_time_zone_from_none( ) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone == "Asia/Kathmandu" # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone == "Asia/Kathmandu" result_str = result.select(nw.col("a").dt.to_string("%Y-%m-%dT%H:%M%z")) expected = {"a": ["2020-01-01T05:45+0545", "2020-01-02T05:45+0545"]} assert_equal_data(result_str, expected) diff --git a/tests/expr_and_series/dt/replace_time_zone_test.py b/tests/expr_and_series/dt/replace_time_zone_test.py index 6876c318a5..b8a78bc25c 100644 --- a/tests/expr_and_series/dt/replace_time_zone_test.py +++ b/tests/expr_and_series/dt/replace_time_zone_test.py @@ -40,7 +40,8 @@ def test_replace_time_zone( result = df.select(nw.col("a").dt.replace_time_zone("Asia/Kathmandu")) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone == "Asia/Kathmandu" # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone == "Asia/Kathmandu" result_str = result.select(nw.col("a").dt.to_string("%Y-%m-%dT%H:%M%z")) expected = {"a": ["2020-01-01T00:00+0545", "2020-01-02T00:00+0545"]} assert_equal_data(result_str, expected) @@ -68,7 +69,8 @@ def test_replace_time_zone_none( result = df.select(nw.col("a").dt.replace_time_zone(None)) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone is None # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone is None result_str = result.select(nw.col("a").dt.to_string("%Y-%m-%dT%H:%M")) expected = {"a": ["2020-01-01T00:00", "2020-01-02T00:00"]} assert_equal_data(result_str, expected) @@ -95,7 +97,8 @@ def test_replace_time_zone_series( result = df.select(df["a"].dt.replace_time_zone("Asia/Kathmandu")) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone == "Asia/Kathmandu" # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone == "Asia/Kathmandu" result_str = result.select(nw.col("a").dt.to_string("%Y-%m-%dT%H:%M%z")) expected = {"a": ["2020-01-01T00:00+0545", "2020-01-02T00:00+0545"]} assert_equal_data(result_str, expected) @@ -121,7 +124,8 @@ def test_replace_time_zone_none_series( result = df.select(df["a"].dt.replace_time_zone(None)) result_dtype = result.collect_schema()["a"] assert result_dtype == nw.Datetime - assert result_dtype.time_zone is None # type: ignore[attr-defined] + assert isinstance(result_dtype, nw.Datetime) + assert result_dtype.time_zone is None result_str = result.select(df["a"].dt.to_string("%Y-%m-%dT%H:%M")) expected = {"a": ["2020-01-01T00:00", "2020-01-02T00:00"]} assert_equal_data(result_str, expected)