"""Power Query ``Date.*`` column expressions."""
from __future__ import annotations
from typing import Union
from pyspark.sql import Column
from pyspark.sql import functions as F
__all__ = ["Date"]
def _as_column(expr: Union[Column, str]) -> Column:
return F.lit(expr) if isinstance(expr, str) else expr
[docs]
class Date:
"""Namespace for Power Query ``Date.*`` functions.
All methods return Spark ``Column`` expressions for use in
:py:meth:`fabrictools.powerquery.table.Table.AddColumn`.
"""
[docs]
@staticmethod
def Year(expr: Union[Column, str]) -> Column:
"""Extract the year from a date or timestamp (Power Query ``Date.Year``).
:param expr: Date or timestamp column, or string literal.
:type expr: ~pyspark.sql.Column | str
:returns: Integer year column expression.
:rtype: ~pyspark.sql.Column
.. rubric:: Example
>>> from fabrictools import Table, Date # doctest: +SKIP
>>> from pyspark.sql import functions as F # doctest: +SKIP
>>> df = Table.AddColumn(df, "Year", Date.Year(F.col("Date of Revenue recognition"))) # doctest: +SKIP
"""
return F.year(_as_column(expr))
[docs]
@staticmethod
def Month(expr: Union[Column, str]) -> Column:
"""Extract the month (1–12) from a date or timestamp (Power Query ``Date.Month``).
:param expr: Date or timestamp column, or string literal.
:type expr: ~pyspark.sql.Column | str
:returns: Integer month column expression.
:rtype: ~pyspark.sql.Column
.. rubric:: Example
>>> from fabrictools import Date # doctest: +SKIP
>>> from pyspark.sql import functions as F # doctest: +SKIP
>>> df.withColumn("month", Date.Month(F.col("order_date"))) # doctest: +SKIP
"""
return F.month(_as_column(expr))
[docs]
@staticmethod
def Day(expr: Union[Column, str]) -> Column:
"""Extract the day of month from a date or timestamp (Power Query ``Date.Day``).
:param expr: Date or timestamp column, or string literal.
:type expr: ~pyspark.sql.Column | str
:returns: Integer day column expression.
:rtype: ~pyspark.sql.Column
.. rubric:: Example
>>> from fabrictools import Date # doctest: +SKIP
>>> from pyspark.sql import functions as F # doctest: +SKIP
>>> df.withColumn("day", Date.Day(F.col("order_date"))) # doctest: +SKIP
"""
return F.dayofmonth(_as_column(expr))
[docs]
@staticmethod
def From(expr: Union[Column, str]) -> Column:
"""Parse or cast a value to date (Power Query ``Date.From``).
:param expr: Column or string literal parseable as a date.
:type expr: ~pyspark.sql.Column | str
:returns: Date column expression.
:rtype: ~pyspark.sql.Column
.. rubric:: Example
>>> from fabrictools import Date # doctest: +SKIP
>>> from pyspark.sql import functions as F # doctest: +SKIP
>>> df.withColumn("order_date", Date.From(F.col("order_date_str"))) # doctest: +SKIP
"""
return F.to_date(_as_column(expr))
[docs]
@staticmethod
def AddDays(expr: Union[Column, str], days: int) -> Column:
"""Add calendar days to a date (Power Query ``Date.AddDays``).
:param expr: Date column or string literal.
:param days: Number of days to add (may be negative).
:type expr: ~pyspark.sql.Column | str
:type days: int
:returns: Shifted date column expression.
:rtype: ~pyspark.sql.Column
.. rubric:: Example
>>> from fabrictools import Date # doctest: +SKIP
>>> from pyspark.sql import functions as F # doctest: +SKIP
>>> df.withColumn("due_date", Date.AddDays(F.col("order_date"), 30)) # doctest: +SKIP
"""
return F.date_add(_as_column(expr), days)