Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/expr/test_literal.py
6939 views
1
from __future__ import annotations
2
3
from datetime import datetime, timezone
4
from typing import Any
5
from zoneinfo import ZoneInfo
6
7
import pytest
8
from dateutil.tz import tzoffset
9
10
import polars as pl
11
from polars.testing import assert_frame_equal
12
13
14
def test_literal_scalar_list_18686() -> None:
15
df = pl.DataFrame({"column1": [1, 2], "column2": ["A", "B"]})
16
out = df.with_columns(lit1=pl.lit([]).cast(pl.List(pl.String)), lit2=pl.lit([]))
17
18
assert out.to_dict(as_series=False) == {
19
"column1": [1, 2],
20
"column2": ["A", "B"],
21
"lit1": [[], []],
22
"lit2": [[], []],
23
}
24
assert out.schema == pl.Schema(
25
[
26
("column1", pl.Int64),
27
("column2", pl.String),
28
("lit1", pl.List(pl.String)),
29
("lit2", pl.List(pl.Null)),
30
]
31
)
32
33
34
def test_literal_integer_20807() -> None:
35
for i in range(100):
36
value = 2**i
37
assert pl.select(pl.lit(value)).item() == value
38
assert pl.select(pl.lit(-value)).item() == -value
39
assert pl.select(pl.lit(value, dtype=pl.Int128)).item() == value
40
assert pl.select(pl.lit(-value, dtype=pl.Int128)).item() == -value
41
42
43
@pytest.mark.parametrize(
44
("tz", "lit_dtype"),
45
[
46
(ZoneInfo("Asia/Kabul"), None),
47
(ZoneInfo("Asia/Kabul"), pl.Datetime("us", "Asia/Kabul")),
48
(ZoneInfo("Europe/Paris"), pl.Datetime("us", "Europe/Paris")),
49
(timezone.utc, pl.Datetime("us", "UTC")),
50
],
51
)
52
def test_literal_datetime_timezone(tz: Any, lit_dtype: pl.DataType | None) -> None:
53
expected_dtype = pl.Datetime("us", time_zone=str(tz))
54
value = datetime(2020, 1, 1, tzinfo=tz)
55
56
df1 = pl.DataFrame({"dt": [value]})
57
df2 = pl.select(dt=pl.lit(value, dtype=lit_dtype))
58
59
assert_frame_equal(df1, df2)
60
assert df1.schema["dt"] == expected_dtype
61
assert df1.item() == value
62
63
64
@pytest.mark.parametrize(
65
("tz", "lit_dtype", "expected_item"),
66
[
67
(
68
# fixed offset from UTC
69
tzoffset(None, 16200),
70
None,
71
datetime(2019, 12, 31, 19, 30, tzinfo=timezone.utc),
72
),
73
(
74
# fixed offset from UTC
75
tzoffset("Kabul", 16200),
76
None,
77
datetime(2019, 12, 31, 19, 30, tzinfo=ZoneInfo("UTC")),
78
),
79
(
80
# fixed offset from UTC with matching timezone
81
tzoffset(None, 16200),
82
pl.Datetime("us", "Asia/Kabul"),
83
datetime(2020, 1, 1, tzinfo=ZoneInfo("Asia/Kabul")),
84
),
85
(
86
# fixed offset from UTC with matching timezone
87
tzoffset("Kabul", 16200),
88
pl.Datetime("us", "Asia/Kabul"),
89
datetime(2020, 1, 1, tzinfo=ZoneInfo("Asia/Kabul")),
90
),
91
],
92
)
93
def test_literal_datetime_timezone_utc_offset(
94
tz: Any, lit_dtype: pl.DataType | None, expected_item: datetime
95
) -> None:
96
overrides = {"schema_overrides": {"dt": lit_dtype}} if lit_dtype else {}
97
value = datetime(2020, 1, 1, tzinfo=tz)
98
99
# validate both frame and lit constructors
100
df1 = pl.DataFrame({"dt": [value]}, **overrides) # type: ignore[arg-type]
101
df2 = pl.select(dt=pl.lit(value, dtype=lit_dtype))
102
103
assert_frame_equal(df1, df2)
104
105
expected_tz = "UTC" if lit_dtype is None else getattr(lit_dtype, "time_zone", None)
106
expected_dtype = pl.Datetime("us", time_zone=expected_tz)
107
108
for df in (df1, df2):
109
assert df.schema["dt"] == expected_dtype
110
assert df.item() == expected_item
111
112
113
def test_literal_datetime_timezone_utc_error() -> None:
114
value = datetime(2020, 1, 1, tzinfo=tzoffset("Somewhere", offset=3600))
115
116
with pytest.raises(
117
TypeError,
118
match=(
119
r"time zone of dtype \('Pacific/Galapagos'\) differs from"
120
r" time zone of value \(tzoffset\('Somewhere', 3600\)\)"
121
),
122
):
123
# the offset does not correspond to the offset of the declared timezone
124
pl.select(dt=pl.lit(value, dtype=pl.Datetime(time_zone="Pacific/Galapagos")))
125
126