Path: blob/main/py-polars/tests/unit/expr/test_literal.py
6939 views
from __future__ import annotations12from datetime import datetime, timezone3from typing import Any4from zoneinfo import ZoneInfo56import pytest7from dateutil.tz import tzoffset89import polars as pl10from polars.testing import assert_frame_equal111213def test_literal_scalar_list_18686() -> None:14df = pl.DataFrame({"column1": [1, 2], "column2": ["A", "B"]})15out = df.with_columns(lit1=pl.lit([]).cast(pl.List(pl.String)), lit2=pl.lit([]))1617assert out.to_dict(as_series=False) == {18"column1": [1, 2],19"column2": ["A", "B"],20"lit1": [[], []],21"lit2": [[], []],22}23assert out.schema == pl.Schema(24[25("column1", pl.Int64),26("column2", pl.String),27("lit1", pl.List(pl.String)),28("lit2", pl.List(pl.Null)),29]30)313233def test_literal_integer_20807() -> None:34for i in range(100):35value = 2**i36assert pl.select(pl.lit(value)).item() == value37assert pl.select(pl.lit(-value)).item() == -value38assert pl.select(pl.lit(value, dtype=pl.Int128)).item() == value39assert pl.select(pl.lit(-value, dtype=pl.Int128)).item() == -value404142@pytest.mark.parametrize(43("tz", "lit_dtype"),44[45(ZoneInfo("Asia/Kabul"), None),46(ZoneInfo("Asia/Kabul"), pl.Datetime("us", "Asia/Kabul")),47(ZoneInfo("Europe/Paris"), pl.Datetime("us", "Europe/Paris")),48(timezone.utc, pl.Datetime("us", "UTC")),49],50)51def test_literal_datetime_timezone(tz: Any, lit_dtype: pl.DataType | None) -> None:52expected_dtype = pl.Datetime("us", time_zone=str(tz))53value = datetime(2020, 1, 1, tzinfo=tz)5455df1 = pl.DataFrame({"dt": [value]})56df2 = pl.select(dt=pl.lit(value, dtype=lit_dtype))5758assert_frame_equal(df1, df2)59assert df1.schema["dt"] == expected_dtype60assert df1.item() == value616263@pytest.mark.parametrize(64("tz", "lit_dtype", "expected_item"),65[66(67# fixed offset from UTC68tzoffset(None, 16200),69None,70datetime(2019, 12, 31, 19, 30, tzinfo=timezone.utc),71),72(73# fixed offset from UTC74tzoffset("Kabul", 16200),75None,76datetime(2019, 12, 31, 19, 30, tzinfo=ZoneInfo("UTC")),77),78(79# fixed offset from UTC with matching timezone80tzoffset(None, 16200),81pl.Datetime("us", "Asia/Kabul"),82datetime(2020, 1, 1, tzinfo=ZoneInfo("Asia/Kabul")),83),84(85# fixed offset from UTC with matching timezone86tzoffset("Kabul", 16200),87pl.Datetime("us", "Asia/Kabul"),88datetime(2020, 1, 1, tzinfo=ZoneInfo("Asia/Kabul")),89),90],91)92def test_literal_datetime_timezone_utc_offset(93tz: Any, lit_dtype: pl.DataType | None, expected_item: datetime94) -> None:95overrides = {"schema_overrides": {"dt": lit_dtype}} if lit_dtype else {}96value = datetime(2020, 1, 1, tzinfo=tz)9798# validate both frame and lit constructors99df1 = pl.DataFrame({"dt": [value]}, **overrides) # type: ignore[arg-type]100df2 = pl.select(dt=pl.lit(value, dtype=lit_dtype))101102assert_frame_equal(df1, df2)103104expected_tz = "UTC" if lit_dtype is None else getattr(lit_dtype, "time_zone", None)105expected_dtype = pl.Datetime("us", time_zone=expected_tz)106107for df in (df1, df2):108assert df.schema["dt"] == expected_dtype109assert df.item() == expected_item110111112def test_literal_datetime_timezone_utc_error() -> None:113value = datetime(2020, 1, 1, tzinfo=tzoffset("Somewhere", offset=3600))114115with pytest.raises(116TypeError,117match=(118r"time zone of dtype \('Pacific/Galapagos'\) differs from"119r" time zone of value \(tzoffset\('Somewhere', 3600\)\)"120),121):122# the offset does not correspond to the offset of the declared timezone123pl.select(dt=pl.lit(value, dtype=pl.Datetime(time_zone="Pacific/Galapagos")))124125126