σ
    hX  γ                  σt    S SK Jr  S SKJrJrJr  \(       a  S SKJr  S SKJ	r	  \" SSS9r
 " S S	\\
   5      rg
)ι    )Ϊannotations)ΪTYPE_CHECKINGΪGenericΪTypeVar)ΪExpr)ΪTimeUnitΪExprTr   )Ϊboundc                  σ   \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrS S jrS!S"S jjrS#S jrS$S jrSrg)%ΪExprDateTimeNamespaceι   c                σ    Xl         g ©N©Ϊ_expr)ΪselfΪexprs     ΪcC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\narwhals/expr_dt.pyΪ__init__ΪExprDateTimeNamespace.__init__   s    Ψ
σ    c                σB   ^  T R                   R                  U 4S j5      $ )uπ  Extract the date from underlying DateTime representation.

Returns:
    A new expression.

Raises:
    NotImplementedError: If pandas default backend is being used.

Examples:
    >>> from datetime import datetime
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame(
    ...     {"a": [datetime(2012, 1, 7, 10), datetime(2027, 12, 13)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.select(nw.col("a").dt.date()).to_native()
    shape: (2, 1)
    ββββββββββββββ
    β a          β
    β ---        β
    β date       β
    ββββββββββββββ‘
    β 2012-01-07 β
    β 2027-12-13 β
    ββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   Ϊ_to_compliant_exprΪdtΪdate©Ϊplxr   s    r   Ϊ<lambda>Ϊ,ExprDateTimeNamespace.date.<locals>.<lambda>-   σ#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧBΡBΤDr   ©r   Ϊ_with_elementwise©r   s   `r   r   ΪExprDateTimeNamespace.date   s   ψ π8 zzΧ+Ρ+άDσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )uΏ  Extract year from underlying DateTime representation.

Returns the year number in the calendar date.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {"a": [datetime(1978, 6, 1), datetime(2065, 1, 1)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("a").dt.year().alias("year"))
    ββββββββββββββββββββ
    |Narwhals DataFrame|
    |------------------|
    |           a  year|
    |0 1978-06-01  1978|
    |1 2065-01-01  2065|
    ββββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊyearr   s    r   r   Ϊ,ExprDateTimeNamespace.year.<locals>.<lambda>J   r!   r   r"   r$   s   `r   r(   ΪExprDateTimeNamespace.year0   s   ψ π2 zzΧ+Ρ+άDσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )am  Extract month from underlying DateTime representation.

Returns the month number starting from 1. The return value ranges from 1 to 12.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table({"a": [datetime(1978, 6, 1), datetime(2065, 1, 1)]})
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("a").dt.month().alias("month")).to_native()
    pyarrow.Table
    a: timestamp[us]
    month: int64
    ----
    a: [[1978-06-01 00:00:00.000000,2065-01-01 00:00:00.000000]]
    month: [[6,1]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊmonthr   s    r   r   Ϊ-ExprDateTimeNamespace.month.<locals>.<lambda>d   s#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧCΡCΤEr   r"   r$   s   `r   r-   ΪExprDateTimeNamespace.monthM   s   ψ π, zzΧ+Ρ+άEσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )a  Extract day from underlying DateTime representation.

Returns the day of month starting from 1. The return value ranges from 1 to 31. (The last day of month differs by months.)

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table({"a": [datetime(1978, 6, 1), datetime(2065, 1, 1)]})
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("a").dt.day().alias("day")).to_native()
    pyarrow.Table
    a: timestamp[us]
    day: int64
    ----
    a: [[1978-06-01 00:00:00.000000,2065-01-01 00:00:00.000000]]
    day: [[1,1]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊdayr   s    r   r   Ϊ+ExprDateTimeNamespace.day.<locals>.<lambda>~   s#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧAΡAΤCr   r"   r$   s   `r   r2   ΪExprDateTimeNamespace.dayg   s   ψ π, zzΧ+Ρ+άCσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )uσ  Extract hour from underlying DateTime representation.

Returns the hour number from 0 to 23.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame(
    ...     {"a": [datetime(1978, 1, 1, 1), datetime(2065, 1, 1, 10)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("a").dt.hour().alias("hour"))
    ββββββββββββββββββββββββββββββββ
    |      Narwhals DataFrame      |
    |------------------------------|
    |shape: (2, 2)                 |
    |βββββββββββββββββββββββ¬βββββββ|
    |β a                   β hour β|
    |β ---                 β ---  β|
    |β datetime[ΞΌs]        β i8   β|
    |βββββββββββββββββββββββͺβββββββ‘|
    |β 1978-01-01 01:00:00 β 1    β|
    |β 2065-01-01 10:00:00 β 10   β|
    |βββββββββββββββββββββββ΄βββββββ|
    ββββββββββββββββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊhourr   s    r   r   Ϊ,ExprDateTimeNamespace.hour.<locals>.<lambda>‘   r!   r   r"   r$   s   `r   r7   ΪExprDateTimeNamespace.hour   s   ψ π> zzΧ+Ρ+άDσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )aA  Extract minutes from underlying DateTime representation.

Returns the minute number from 0 to 59.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {"a": [datetime(1978, 1, 1, 1, 1), datetime(2065, 1, 1, 10, 20)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("a").dt.minute().alias("minute")).to_native()
                        a  minute
    0 1978-01-01 01:01:00       1
    1 2065-01-01 10:20:00      20
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊminuter   s    r   r   Ϊ.ExprDateTimeNamespace.minute.<locals>.<lambda>Ί   σ#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧDΡDΤFr   r"   r$   s   `r   r<   ΪExprDateTimeNamespace.minute€   s   ψ π* zzΧ+Ρ+άFσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )a§  Extract seconds from underlying DateTime representation.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table(
    ...     {
    ...         "a": [
    ...             datetime(1978, 1, 1, 1, 1, 1),
    ...             datetime(2065, 1, 1, 10, 20, 30),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("a").dt.second().alias("second")).to_native()
    pyarrow.Table
    a: timestamp[us]
    second: int64
    ----
    a: [[1978-01-01 01:01:01.000000,2065-01-01 10:20:30.000000]]
    second: [[1,30]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊsecondr   s    r   r   Ϊ.ExprDateTimeNamespace.second.<locals>.<lambda>Ω   r>   r   r"   r$   s   `r   rB   ΪExprDateTimeNamespace.second½   s   ψ π6 zzΧ+Ρ+άFσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )aΰ  Extract milliseconds from underlying DateTime representation.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table(
    ...     {
    ...         "a": [
    ...             datetime(1978, 1, 1, 1, 1, 1, 0),
    ...             datetime(2065, 1, 1, 10, 20, 30, 67000),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     nw.col("a").dt.millisecond().alias("millisecond")
    ... ).to_native()
    pyarrow.Table
    a: timestamp[us]
    millisecond: int64
    ----
    a: [[1978-01-01 01:01:01.000000,2065-01-01 10:20:30.067000]]
    millisecond: [[0,67]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊmillisecondr   s    r   r   Ϊ3ExprDateTimeNamespace.millisecond.<locals>.<lambda>ϊ   σ#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧIΡIΤKr   r"   r$   s   `r   rG   Ϊ!ExprDateTimeNamespace.millisecondά   σ   ψ π: zzΧ+Ρ+άKσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )aγ  Extract microseconds from underlying DateTime representation.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table(
    ...     {
    ...         "a": [
    ...             datetime(1978, 1, 1, 1, 1, 1, 0),
    ...             datetime(2065, 1, 1, 10, 20, 30, 67000),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     nw.col("a").dt.microsecond().alias("microsecond")
    ... ).to_native()
    pyarrow.Table
    a: timestamp[us]
    microsecond: int64
    ----
    a: [[1978-01-01 01:01:01.000000,2065-01-01 10:20:30.067000]]
    microsecond: [[0,67000]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊmicrosecondr   s    r   r   Ϊ3ExprDateTimeNamespace.microsecond.<locals>.<lambda>  rI   r   r"   r$   s   `r   rN   Ϊ!ExprDateTimeNamespace.microsecondύ   rK   r   c                σB   ^  T R                   R                  U 4S j5      $ )aα  Extract Nanoseconds from underlying DateTime representation.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table(
    ...     {
    ...         "a": [
    ...             datetime(1978, 1, 1, 1, 1, 1, 0),
    ...             datetime(2065, 1, 1, 10, 20, 30, 67000),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     nw.col("a").dt.nanosecond().alias("nanosecond")
    ... ).to_native()
    pyarrow.Table
    a: timestamp[us]
    nanosecond: int64
    ----
    a: [[1978-01-01 01:01:01.000000,2065-01-01 10:20:30.067000]]
    nanosecond: [[0,67000000]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊ
nanosecondr   s    r   r   Ϊ2ExprDateTimeNamespace.nanosecond.<locals>.<lambda><  s#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧHΡHΤJr   r"   r$   s   `r   rS   Ϊ ExprDateTimeNamespace.nanosecond  s   ψ π: zzΧ+Ρ+άJσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )uΥ  Get ordinal day.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {"a": [datetime(2020, 1, 1), datetime(2020, 8, 3)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(a_ordinal_day=nw.col("a").dt.ordinal_day())
    βββββββββββββββββββββββββββββ
    |    Narwhals DataFrame     |
    |---------------------------|
    |           a  a_ordinal_day|
    |0 2020-01-01              1|
    |1 2020-08-03            216|
    βββββββββββββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊordinal_dayr   s    r   r   Ϊ3ExprDateTimeNamespace.ordinal_day.<locals>.<lambda>W  rI   r   r"   r$   s   `r   rX   Ϊ!ExprDateTimeNamespace.ordinal_day?  s   ψ π. zzΧ+Ρ+άKσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )u  Extract the week day from the underlying Date representation.

Returns:
    Returns the ISO weekday number where monday = 1 and sunday = 7

Examples:
    >>> from datetime import datetime
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {"a": [datetime(2020, 1, 1), datetime(2020, 8, 3)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(a_week_day=nw.col("a").dt.weekday())
    ββββββββββββββββββββββββββ
    |   Narwhals DataFrame   |
    |------------------------|
    |           a  a_week_day|
    |0 2020-01-01           3|
    |1 2020-08-03           1|
    ββββββββββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊweekdayr   s    r   r   Ϊ/ExprDateTimeNamespace.weekday.<locals>.<lambda>r  s#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧEΡEΤGr   r"   r$   s   `r   r]   ΪExprDateTimeNamespace.weekdayZ  s   ψ π. zzΧ+Ρ+άGσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )uΊ  Get total minutes.

Returns:
    A new expression.

Notes:
    The function outputs the total minutes in the int dtype by default,
    however, pandas may change the dtype to float when there are missing values,
    consider using `fill_null()` and `cast` in this case.

Examples:
    >>> from datetime import timedelta
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame(
    ...     {"a": [timedelta(minutes=10), timedelta(minutes=20, seconds=40)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     a_total_minutes=nw.col("a").dt.total_minutes()
    ... ).to_native()
    shape: (2, 2)
    ββββββββββββββββ¬ββββββββββββββββββ
    β a            β a_total_minutes β
    β ---          β ---             β
    β duration[ΞΌs] β i64             β
    ββββββββββββββββͺββββββββββββββββββ‘
    β 10m          β 10              β
    β 20m 40s      β 20              β
    ββββββββββββββββ΄ββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊtotal_minutesr   s    r   r   Ϊ5ExprDateTimeNamespace.total_minutes.<locals>.<lambda>  σ#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧKΡKΤMr   r"   r$   s   `r   rb   Ϊ#ExprDateTimeNamespace.total_minutesu  σ    ψ π@ zzΧ+Ρ+άMσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )uΏ  Get total seconds.

Returns:
    A new expression.

Notes:
    The function outputs the total seconds in the int dtype by default,
    however, pandas may change the dtype to float when there are missing values,
    consider using `fill_null()` and `cast` in this case.

Examples:
    >>> from datetime import timedelta
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame(
    ...     {"a": [timedelta(seconds=10), timedelta(seconds=20, milliseconds=40)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     a_total_seconds=nw.col("a").dt.total_seconds()
    ... ).to_native()
    shape: (2, 2)
    ββββββββββββββββ¬ββββββββββββββββββ
    β a            β a_total_seconds β
    β ---          β ---             β
    β duration[ΞΌs] β i64             β
    ββββββββββββββββͺββββββββββββββββββ‘
    β 10s          β 10              β
    β 20s 40ms     β 20              β
    ββββββββββββββββ΄ββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊtotal_secondsr   s    r   r   Ϊ5ExprDateTimeNamespace.total_seconds.<locals>.<lambda>Ί  rd   r   r"   r$   s   `r   ri   Ϊ#ExprDateTimeNamespace.total_seconds  rf   r   c                σB   ^  T R                   R                  U 4S j5      $ )u}  Get total milliseconds.

Returns:
    A new expression.

Notes:
    The function outputs the total milliseconds in the int dtype by default,
    however, pandas may change the dtype to float when there are missing values,
    consider using `fill_null()` and `cast` in this case.

Examples:
    >>> from datetime import timedelta
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame(
    ...     {
    ...         "a": [
    ...             timedelta(milliseconds=10),
    ...             timedelta(milliseconds=20, microseconds=40),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     a_total_milliseconds=nw.col("a").dt.total_milliseconds()
    ... ).to_native()
    shape: (2, 2)
    ββββββββββββββββ¬βββββββββββββββββββββββ
    β a            β a_total_milliseconds β
    β ---          β ---                  β
    β duration[ΞΌs] β i64                  β
    ββββββββββββββββͺβββββββββββββββββββββββ‘
    β 10ms         β 10                   β
    β 20040Β΅s      β 20                   β
    ββββββββββββββββ΄βββββββββββββββββββββββ
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊtotal_millisecondsr   s    r   r   Ϊ:ExprDateTimeNamespace.total_milliseconds.<locals>.<lambda>γ  σ#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧPΡPΤRr   r"   r$   s   `r   rn   Ϊ(ExprDateTimeNamespace.total_milliseconds½  s    ψ πJ zzΧ+Ρ+άRσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )a  Get total microseconds.

Returns:
    A new expression.

Notes:
    The function outputs the total microseconds in the int dtype by default,
    however, pandas may change the dtype to float when there are missing values,
    consider using `fill_null()` and `cast` in this case.

Examples:
    >>> from datetime import timedelta
    >>> import pyarrow as pa
    >>> import narwhals as nw
    >>> df_native = pa.table(
    ...     {
    ...         "a": [
    ...             timedelta(microseconds=10),
    ...             timedelta(milliseconds=1, microseconds=200),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     a_total_microseconds=nw.col("a").dt.total_microseconds()
    ... ).to_native()
    pyarrow.Table
    a: duration[us]
    a_total_microseconds: int64
    ----
    a: [[10,1200]]
    a_total_microseconds: [[10,1200]]
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊtotal_microsecondsr   s    r   r   Ϊ:ExprDateTimeNamespace.total_microseconds.<locals>.<lambda>	  rp   r   r"   r$   s   `r   rt   Ϊ(ExprDateTimeNamespace.total_microsecondsζ  s    ψ πD zzΧ+Ρ+άRσ
π 	
r   c                σB   ^  T R                   R                  U 4S j5      $ )aώ  Get total nanoseconds.

Returns:
    A new expression.

Notes:
    The function outputs the total nanoseconds in the int dtype by default,
    however, pandas may change the dtype to float when there are missing values,
    consider using `fill_null()` and `cast` in this case.

Examples:
    >>> from datetime import timedelta
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {
    ...         "a": pd.to_datetime(
    ...             [
    ...                 "2024-01-01 00:00:00.000000001",
    ...                 "2024-01-01 00:00:00.000000002",
    ...             ]
    ...         )
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     a_diff_total_nanoseconds=nw.col("a").diff().dt.total_nanoseconds()
    ... ).to_native()
                                  a  a_diff_total_nanoseconds
    0 2024-01-01 00:00:00.000000001                       NaN
    1 2024-01-01 00:00:00.000000002                       1.0
c                σj   > TR                   R                  U 5      R                  R                  5       $ r   )r   r   r   Ϊtotal_nanosecondsr   s    r   r   Ϊ9ExprDateTimeNamespace.total_nanoseconds.<locals>.<lambda>.  s#   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧOΡOΤQr   r"   r$   s   `r   ry   Ϊ'ExprDateTimeNamespace.total_nanoseconds  s    ψ πB zzΧ+Ρ+άQσ
π 	
r   c                σF   ^ ^ T R                   R                  UU 4S j5      $ )uW	  Convert a Date/Time/Datetime column into a String column with the given format.

Arguments:
    format: Format to format temporal column with.

Returns:
    A new expression.

Notes:
    Unfortunately, different libraries interpret format directives a bit
    differently.

    - Chrono, the library used by Polars, uses `"%.f"` for fractional seconds,
      whereas pandas and Python stdlib use `".%f"`.
    - PyArrow interprets `"%S"` as "seconds, including fractional seconds"
      whereas most other tools interpret it as "just seconds, as 2 digits".
    ---
    Therefore, we make the following adjustments.

    - for pandas-like libraries, we replace `"%S.%f"` with `"%S%.f"`.
    - for PyArrow, we replace `"%S.%f"` with `"%S"`.
    ---
    Workarounds like these don't make us happy, and we try to avoid them as
    much as possible, but here we feel like it's the best compromise.

    If you just want to format a date/datetime Series as a local datetime
    string, and have it work as consistently as possible across libraries,
    we suggest using:

    - `"%Y-%m-%dT%H:%M:%S%.f"` for datetimes
    - `"%Y-%m-%d"` for dates
    ---
    Though note that, even then, different tools may return a different number
    of trailing zeros. Nonetheless, this is probably consistent enough for
    most applications.

    If you have an application where this is not enough, please open an issue
    and let us know.

Examples:
    >>> from datetime import datetime
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame(
    ...     {"a": [datetime(2020, 3, 1), datetime(2020, 5, 1)]}
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.select(nw.col("a").dt.to_string("%Y/%m/%d %H:%M:%S"))
    βββββββββββββββββββββββββ
    |  Narwhals DataFrame   |
    |-----------------------|
    |shape: (2, 1)          |
    |βββββββββββββββββββββββ|
    |β a                   β|
    |β ---                 β|
    |β str                 β|
    |βββββββββββββββββββββββ‘|
    |β 2020/03/01 00:00:00 β|
    |β 2020/05/01 00:00:00 β|
    |βββββββββββββββββββββββ|
    βββββββββββββββββββββββββ
c                σl   > TR                   R                  U 5      R                  R                  T5      $ r   )r   r   r   Ϊ	to_string)r   Ϊformatr   s    r   r   Ϊ1ExprDateTimeNamespace.to_string.<locals>.<lambda>q  s%   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧGΡGΘΤOr   r"   )r   r   s   ``r   r~   ΪExprDateTimeNamespace.to_string1  s    ω π~ zzΧ+Ρ+έOσ
π 	
r   c                σF   ^ ^ T R                   R                  U U4S j5      $ )a  Replace time zone.

Arguments:
    time_zone: Target time zone.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime, timezone
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {
    ...         "a": [
    ...             datetime(2024, 1, 1, tzinfo=timezone.utc),
    ...             datetime(2024, 1, 2, tzinfo=timezone.utc),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.select(nw.col("a").dt.replace_time_zone("Asia/Kathmandu")).to_native()
                              a
    0 2024-01-01 00:00:00+05:45
    1 2024-01-02 00:00:00+05:45
c                σl   > TR                   R                  U 5      R                  R                  T5      $ r   )r   r   r   Ϊreplace_time_zone©r   r   Ϊ	time_zones    r   r   Ϊ9ExprDateTimeNamespace.replace_time_zone.<locals>.<lambda>  σ&   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧOΡOΠPYΤZr   r"   )r   r   s   ``r   r   Ϊ'ExprDateTimeNamespace.replace_time_zonet  s   ω π6 zzΧ+Ρ+έZσ
π 	
r   c                σf   ^ ^ Tc  Sn[        U5      eT R                  R                  U U4S j5      $ )a  Convert to a new time zone.

If converting from a time-zone-naive column, then conversion happens
as if converting from UTC.

Arguments:
    time_zone: Target time zone.

Returns:
    A new expression.

Examples:
    >>> from datetime import datetime, timezone
    >>> import pandas as pd
    >>> import narwhals as nw
    >>> df_native = pd.DataFrame(
    ...     {
    ...         "a": [
    ...             datetime(2024, 1, 1, tzinfo=timezone.utc),
    ...             datetime(2024, 1, 2, tzinfo=timezone.utc),
    ...         ]
    ...     }
    ... )
    >>> df = nw.from_native(df_native)
    >>> df.select(nw.col("a").dt.convert_time_zone("Asia/Kathmandu")).to_native()
                              a
    0 2024-01-01 05:45:00+05:45
    1 2024-01-02 05:45:00+05:45
zTarget `time_zone` cannot be `None` in `convert_time_zone`. Please use `replace_time_zone(None)` if you want to remove the time zone.c                σl   > TR                   R                  U 5      R                  R                  T5      $ r   )r   r   r   Ϊconvert_time_zoner   s    r   r   Ϊ9ExprDateTimeNamespace.convert_time_zone.<locals>.<lambda>΅  r   r   )Ϊ	TypeErrorr   r#   )r   r   Ϊmsgs   `` r   r   Ϊ'ExprDateTimeNamespace.convert_time_zone  s7   ω π< Ρπ ZCάC.Π ΨzzΧ+Ρ+έZσ
π 	
r   c                σv   ^ ^ TS;  a  ST< S3n[        U5      eT R                  R                  U U4S j5      $ )u  Return a timestamp in the given time unit.

Arguments:
    time_unit: One of
        - 'ns': nanosecond.
        - 'us': microsecond.
        - 'ms': millisecond.

Returns:
    A new expression.

Examples:
    >>> from datetime import date
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame({"date": [date(2001, 1, 1), None]})
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(nw.col("date").dt.timestamp("ms").alias("timestamp_ms"))
    βββββββββββββββββββββββββββββββ
    |     Narwhals DataFrame      |
    |-----------------------------|
    |shape: (2, 2)                |
    |ββββββββββββββ¬βββββββββββββββ|
    |β date       β timestamp_ms β|
    |β ---        β ---          β|
    |β date       β i64          β|
    |ββββββββββββββͺβββββββββββββββ‘|
    |β 2001-01-01 β 978307200000 β|
    |β null       β null         β|
    |ββββββββββββββ΄βββββββββββββββ|
    βββββββββββββββββββββββββββββββ
>   ΪmsΪnsΪusz=invalid `time_unit`

Expected one of {'ns', 'us', 'ms'}, got Ϊ.c                σl   > TR                   R                  U 5      R                  R                  T5      $ r   )r   r   r   Ϊ	timestamp)r   r   Ϊ	time_units    r   r   Ϊ1ExprDateTimeNamespace.timestamp.<locals>.<lambda>ΰ  s%   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧGΡGΘ	ΤRr   )Ϊ
ValueErrorr   r#   )r   r   r   s   `` r   r   ΪExprDateTimeNamespace.timestampΈ  sM   ω πB Π.Σ.πAΨAJΑΘQπPπ τ S/Π!ΨzzΧ+Ρ+έRσ
π 	
r   c                σF   ^ ^ T R                   R                  UU 4S j5      $ )u  Divide the date/datetime range into buckets.

Arguments:
    every: Length of bucket. Must be of form `<multiple><unit>`,
        where `multiple` is a positive integer and `unit` is one of

        - 'ns': nanosecond.
        - 'us': microsecond.
        - 'ms': millisecond.
        - 's': second.
        - 'm': minute.
        - 'h': hour.
        - 'd': day.
        - 'mo': month.
        - 'q': quarter.
        - 'y': year.

Returns:
    Expression of data type `Date` or `Datetime`.

Examples:
    >>> from datetime import datetime
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame({"datetime": [datetime(2021, 3, 1, 12, 34)]})
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     nw.col("datetime").dt.truncate("1h").alias("datetime_trunc")
    ... )
    βββββββββββββββββββββββββββββββββββββββββββββββ
    |             Narwhals DataFrame              |
    |---------------------------------------------|
    |shape: (1, 2)                                |
    |βββββββββββββββββββββββ¬ββββββββββββββββββββββ|
    |β datetime            β datetime_trunc      β|
    |β ---                 β ---                 β|
    |β datetime[ΞΌs]        β datetime[ΞΌs]        β|
    |βββββββββββββββββββββββͺββββββββββββββββββββββ‘|
    |β 2021-03-01 12:34:00 β 2021-03-01 12:00:00 β|
    |βββββββββββββββββββββββ΄ββββββββββββββββββββββ|
    βββββββββββββββββββββββββββββββββββββββββββββββ
c                σl   > TR                   R                  U 5      R                  R                  T5      $ r   )r   r   r   Ϊtruncate)r   Ϊeveryr   s    r   r   Ϊ0ExprDateTimeNamespace.truncate.<locals>.<lambda>  s%   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧFΡFΐuΤMr   r"   )r   r   s   ``r   r   ΪExprDateTimeNamespace.truncateγ  s    ω πV zzΧ+Ρ+έMσ
π 	
r   c                σF   ^ ^ T R                   R                  UU 4S j5      $ )u·  Offset this date by a relative time offset.

Arguments:
    by: The offset. Must be of form `<multiple><unit>`,
        where `multiple` is a positive integer and `unit` is one of

        - 'ns': nanosecond.
        - 'us': microsecond.
        - 'ms': millisecond.
        - 's': second.
        - 'm': minute.
        - 'h': hour.
        - 'd': day.
        - 'mo': month.
        - 'q': quarter.
        - 'y': year.

Returns:
    Expression of data type `Date` or `Datetime`.

Examples:
    >>> from datetime import datetime
    >>> import polars as pl
    >>> import narwhals as nw
    >>> df_native = pl.DataFrame({"datetime": [datetime(2021, 3, 1, 12, 34)]})
    >>> df = nw.from_native(df_native)
    >>> df.with_columns(
    ...     nw.col("datetime").dt.offset_by("1h").alias("datetime_offset_by_1h")
    ... )
    βββββββββββββββββββββββββββββββββββββββββββββββββ
    |              Narwhals DataFrame               |
    |-----------------------------------------------|
    |shape: (1, 2)                                  |
    |βββββββββββββββββββββββ¬ββββββββββββββββββββββββ|
    |β datetime            β datetime_offset_by_1h β|
    |β ---                 β ---                   β|
    |β datetime[ΞΌs]        β datetime[ΞΌs]          β|
    |βββββββββββββββββββββββͺββββββββββββββββββββββββ‘|
    |β 2021-03-01 12:34:00 β 2021-03-01 13:34:00   β|
    |βββββββββββββββββββββββ΄ββββββββββββββββββββββββ|
    βββββββββββββββββββββββββββββββββββββββββββββββββ
c                σl   > TR                   R                  U 5      R                  R                  T5      $ r   )r   r   r   Ϊ	offset_by)r   Ϊbyr   s    r   r   Ϊ1ExprDateTimeNamespace.offset_by.<locals>.<lambda>>  s%   ψ 

Χ5Ρ5°cΣ:Χ=Ρ=ΧGΡGΘΤKr   r"   )r   r₯   s   ``r   r€   ΪExprDateTimeNamespace.offset_by  s    ω πV zzΧ+Ρ+έKσ
π 	
r   r   N)r   r	   ΪreturnΪNone)r¨   r	   )r   Ϊstrr¨   r	   )r   z
str | Noner¨   r	   )r   rͺ   r¨   r	   )r   )r   r   r¨   r	   )r   rͺ   r¨   r	   )r₯   rͺ   r¨   r	   )Ϊ__name__Ϊ
__module__Ϊ__qualname__Ϊ__firstlineno__r   r   r(   r-   r2   r7   r<   rB   rG   rN   rS   rX   r]   rb   ri   rn   rt   ry   r~   r   r   r   r   r€   Ϊ__static_attributes__© r   r   r   r      s    ττ
τ@
τ:
τ4
τ4!
τF
τ2
τ>
τB
τB
τB
τ6
τ6"
τH"
τH'
τR$
τL#
τJA
τF
τ>#
φJ)
τV-
χ^-
r   r   N)Ϊ
__future__r   Ϊtypingr   r   r   Ϊnarwhals.exprr   Ϊnarwhals.typingr   r	   r   r°   r   r   Ϊ<module>r΅      s5   πέ "η 2Ρ 2ζέ"έ(αvΡ&τs
G ENυ s
r   