diff --git a/python/cudf_polars/cudf_polars/dsl/expressions/datetime.py b/python/cudf_polars/cudf_polars/dsl/expressions/datetime.py index af621a6e0fae..ec60024c1b01 100644 --- a/python/cudf_polars/cudf_polars/dsl/expressions/datetime.py +++ b/python/cudf_polars/cudf_polars/dsl/expressions/datetime.py @@ -108,6 +108,8 @@ def from_polars(cls, obj: pl_expr.TemporalFunction) -> Self: *_COMPONENT_MAP.keys(), Name.IsLeapYear, Name.OrdinalDay, + Name.Week, + Name.IsoYear, Name.MonthStart, Name.MonthEnd, } @@ -140,6 +142,30 @@ def do_evaluate( for child in self.children ] (column,) = columns + if self.name is TemporalFunction.Name.Week: + result = plc.strings.convert.convert_integers.to_integers( + plc.strings.convert.convert_datetime.from_timestamps( + column.obj, + format="%V", + input_strings_names=plc.interop.from_arrow( + pa.array([], type=pa.string()) + ), + ), + plc.types.DataType(plc.types.TypeId.INT8), + ) + return Column(result) + if self.name is TemporalFunction.Name.IsoYear: + result = plc.strings.convert.convert_integers.to_integers( + plc.strings.convert.convert_datetime.from_timestamps( + column.obj, + format="%G", + input_strings_names=plc.interop.from_arrow( + pa.array([], type=pa.string()) + ), + ), + plc.types.DataType(plc.types.TypeId.INT32), + ) + return Column(result) if self.name is TemporalFunction.Name.MonthStart: ends = plc.datetime.last_day_of_month(column.obj) days_to_subtract = plc.datetime.days_in_month(column.obj) diff --git a/python/cudf_polars/tests/expressions/test_datetime_basic.py b/python/cudf_polars/tests/expressions/test_datetime_basic.py index 4dfe691af3e0..73735255b9fa 100644 --- a/python/cudf_polars/tests/expressions/test_datetime_basic.py +++ b/python/cudf_polars/tests/expressions/test_datetime_basic.py @@ -224,3 +224,44 @@ def test_ordinal_day(start_date, end_date): ) assert_gpu_result_equal(q) + + +def test_isoweek(): + df = pl.DataFrame( + { + "date": [ + datetime.date(1999, 12, 27), + datetime.date(2000, 1, 3), + datetime.date(2000, 6, 15), + datetime.date(2000, 12, 31), + datetime.date(2001, 1, 1), + datetime.date(2001, 12, 30), + datetime.date(2002, 1, 1), + ] + } + ).lazy() + + q = df.with_columns(pl.col("date").dt.week().alias("isoweek")) + + assert_gpu_result_equal(q) + + +def test_isoyear(): + df = pl.DataFrame( + { + "date": [ + datetime.date(1999, 12, 27), + datetime.date(2000, 1, 3), + datetime.date(2000, 2, 29), + datetime.date(2000, 6, 15), + datetime.date(2000, 12, 31), + datetime.date(2001, 1, 1), + datetime.date(2001, 12, 30), + datetime.date(2002, 1, 1), + ] + } + ).lazy() + + q = df.with_columns(pl.col("date").dt.iso_year().alias("isoyear")) + + assert_gpu_result_equal(q)