Skip to content
5 changes: 2 additions & 3 deletions narwhals/_arrow/series_dt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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":
Expand Down Expand Up @@ -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))
Expand Down
4 changes: 2 additions & 2 deletions narwhals/_dask/expr_dt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
)
Expand Down
2 changes: 1 addition & 1 deletion narwhals/_pandas_like/series.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions narwhals/_pandas_like/series_dt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,)
Expand Down
8 changes: 4 additions & 4 deletions narwhals/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
)

Expand Down
9 changes: 6 additions & 3 deletions tests/expr_and_series/dt/convert_time_zone_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
12 changes: 8 additions & 4 deletions tests/expr_and_series/dt/replace_time_zone_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Loading