Path: blob/main/py-polars/tests/unit/constructors/test_series.py
6939 views
from __future__ import annotations12from datetime import date, datetime, timedelta3from typing import TYPE_CHECKING, Any45import numpy as np6import pandas as pd7import pytest89import polars as pl10from polars.testing.asserts.series import assert_series_equal1112if TYPE_CHECKING:13from polars._typing import PolarsDataType141516def test_series_mixed_dtypes_list() -> None:17values = [[0.1, 1]]18s = pl.Series(values, strict=True)19assert s.dtype == pl.List(pl.Float64)20assert s.to_list() == [[0.1, 1.0]]212223def test_series_mixed_dtypes_string() -> None:24values = [[12], "foo", 9]2526with pytest.raises(TypeError, match="unexpected value"):27pl.Series(values)2829s = pl.Series(values, strict=False)30assert s.dtype == pl.String31assert s.to_list() == ["[12]", "foo", "9"]32assert s[1] == "foo"333435def test_series_mixed_dtypes_object() -> None:36values = [[12], b"foo", 9]3738with pytest.raises(TypeError, match="unexpected value"):39pl.Series(values)4041s = pl.Series(values, strict=False)42assert s.dtype.is_object()43assert s.to_list() == values44assert s[1] == b"foo"454647# https://github.com/pola-rs/polars/issues/1513948@pytest.mark.parametrize("dtype", [pl.List(pl.Int64), None])49def test_sequence_of_series_with_dtype(dtype: PolarsDataType | None) -> None:50values = [1, 2, 3]51int_series = pl.Series(values)52list_series = pl.Series([int_series], dtype=dtype)5354assert list_series.to_list() == [values]55assert list_series.dtype == pl.List(pl.Int64)565758@pytest.mark.parametrize(59("values", "dtype", "expected_dtype"),60[61([1, 1.0, 1], None, pl.Float64),62([1, 1, "1.0"], None, pl.String),63([1, 1.0, "1.0"], None, pl.String),64([True, 1], None, pl.Int64),65([True, 1.0], None, pl.Float64),66([True, 1], pl.Boolean, pl.Boolean),67([True, 1.0], pl.Boolean, pl.Boolean),68([False, "1.0"], None, pl.String),69],70)71def test_upcast_primitive_and_strings(72values: list[Any], dtype: PolarsDataType, expected_dtype: PolarsDataType73) -> None:74with pytest.raises(TypeError):75pl.Series(values, dtype=dtype, strict=True)7677assert pl.Series(values, dtype=dtype, strict=False).dtype == expected_dtype787980def test_preserve_decimal_precision() -> None:81dtype = pl.Decimal(None, 1)82s = pl.Series(dtype=dtype)83assert s.dtype == dtype848586@pytest.mark.parametrize("dtype", [None, pl.Duration("ms")])87def test_large_timedelta(dtype: pl.DataType | None) -> None:88values = [timedelta.min, timedelta.max]89s = pl.Series(values, dtype=dtype)90assert s.dtype == pl.Duration("ms")9192# Microsecond precision is lost93expected = [timedelta.min, timedelta.max - timedelta(microseconds=999)]94assert s.to_list() == expected959697def test_array_large_u64() -> None:98u64_max = 2**64 - 199values = [[u64_max]]100dtype = pl.Array(pl.UInt64, 1)101s = pl.Series(values, dtype=dtype)102assert s.dtype == dtype103assert s.to_list() == values104105106def test_series_init_ambiguous_datetime() -> None:107value = datetime(2001, 10, 28, 2)108dtype = pl.Datetime(time_zone="Europe/Belgrade")109110result = pl.Series([value], dtype=dtype, strict=True)111expected = pl.Series([datetime(2001, 10, 28, 3)]).dt.replace_time_zone(112"Europe/Belgrade"113)114assert_series_equal(result, expected)115116result = pl.Series([value], dtype=dtype, strict=False)117assert_series_equal(result, expected)118119120def test_series_init_nonexistent_datetime() -> None:121value = datetime(2024, 3, 31, 2, 30)122dtype = pl.Datetime(time_zone="Europe/Amsterdam")123124result = pl.Series([value], dtype=dtype, strict=True)125expected = pl.Series([datetime(2024, 3, 31, 4, 30)]).dt.replace_time_zone(126"Europe/Amsterdam"127)128assert_series_equal(result, expected)129130result = pl.Series([value], dtype=dtype, strict=False)131assert_series_equal(result, expected)132133134# https://github.com/pola-rs/polars/issues/15518135def test_series_init_np_temporal_with_nat_15518() -> None:136arr = np.array(["2020-01-01", "2020-01-02", "2020-01-03"], "datetime64[D]")137arr[1] = np.datetime64("NaT")138139result = pl.Series(arr)140141expected = pl.Series([date(2020, 1, 1), None, date(2020, 1, 3)])142assert_series_equal(result, expected)143144145def test_series_init_pandas_timestamp_18127() -> None:146result = pl.Series([pd.Timestamp("2000-01-01T00:00:00.123456789", tz="UTC")])147# Note: time unit is not (yet) respected, it should be Datetime('ns', 'UTC').148assert result.dtype == pl.Datetime("us", "UTC")149150151def test_series_init_np_2d_zero_zero_shape() -> None:152arr = np.array([]).reshape(0, 0)153assert_series_equal(154pl.Series("a", arr),155pl.Series("a", [], pl.Array(pl.Float64, 0)),156)157158159def test_series_init_np_2d_empty() -> None:160arr = np.array([]).reshape(0, 2)161assert_series_equal(162pl.Series("a", arr),163pl.Series("a", [], pl.Array(pl.Float64, 2)),164)165166167def test_list_null_constructor_schema() -> None:168expected = pl.List(pl.Null)169assert pl.Series([[]]).dtype == expected170assert pl.Series([[]], dtype=pl.List).dtype == expected171172173