在 Polars 中轻松将字符串列转换为 pl.datetime

考虑一个具有 str 类型列的 Polars 数据框,该列以 '27 July 2020' 格式指示日期。我想将此列转换为 polars.datetime 类型,这与 Python 标准 datetime 不同。以下代码使用标准的 datetime 格式,但 Polars 无法将列中的值识别为日期。

import polars as pl
from datetime import datetime

df = pd.read_csv('<some CSV file containing a column called 'event_date'>')
df = df.with_columns([   
        pl.col('event_date').apply(lambda x: x.replace(" ","-"))
                            .apply(lambda x: datetime.strptime(x, '%d-%B-%Y'))
])

假设我们尝试进一步处理 df 以创建一个新列,指示事件发生的季度。

df = df.with_columns([
        pl.col('event_date').apply(lambda x: x.month)
                            .apply(lambda x: 1 if x in range(1,4) else 2 if x in range(4,7) else 3 if x in range(7,10) else 4)
                            .alias('quarter')
])

该代码返回以下错误,因为它将 event_type 限定为 dtype Object("object") 而不是 datetimepolars.datetime

thread '<unnamed>' panicked at 'dtype Object("object") not supported', src/series.rs:992:24
--- PyO3 is resuming a panic after fetching a PanicException from Python. ---
PanicException: Unwrapped panic from Python code
stack overflow Easily convert string column to pl.datetime in Polars
原文答案
author avatar

接受的答案

将字符串转换为日期/日期时间的最简单方法是使用 Polars 自己的 strptime 函数(而不是 Python 的 datetime 模块中的同名函数)。

例如,让我们从这个数据开始。

import polars as pl

df = pl.DataFrame({
    'date_str': ["27 July 2020", "31 December 2020"]
})
print(df)
shape: (2, 1)
┌──────────────────┐
│ date_str         │
│ ---              │
│ str              │
╞══════════════════╡
│ 27 July 2020     │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 31 December 2020 │
└──────────────────┘

要进行转换,请使用 Polars 的 strptime 函数。

df.with_column(pl.col('date_str').str.strptime(pl.Date, fmt='%d %B %Y').cast(pl.Datetime))
shape: (2, 1)
┌─────────────────────┐
│ date_str            │
│ ---                 │
│ datetime[μs]        │
╞═════════════════════╡
│ 2020-07-27 00:00:00 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2020-12-31 00:00:00 │
└─────────────────────┘

请注意,我们不需要用破折号替换空格。我已将结果转换为日期时间(根据您的问题),但您可以改用日期。

目前,当返回类型为 python Date/Datetime 对象时, apply 方法不起作用,但有一个 request 用于此。也就是说,最好使用 Polars 的 strptime 。它会比调用 python datetime 代码快得多。

编辑:从 Polars 0.13.19 开始, apply 方法将自动将 Python 日期/日期时间转换为 Polars 日期/日期时间。


答案:

作者头像

要在 polars 中将字符串列更改为日期时间,请使用 str.strptime()。

import polars as pl
df = pl.DataFrame(df_pandas)

df

shape: (100, 2)
┌────────────┬────────┐
│ dates_col  ┆ ticker │
│ ---        ┆ ---    │
│ str        ┆ str    │
╞════════════╪════════╡
│ 2022-02-25 ┆ RDW    │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 2008-05-28 ┆ ARTX   │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 2015-05-21 ┆ CBAT   │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 2009-02-09 ┆ ANNB   │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤

df.with_column(pl.col("dates_col").str.strptime(pl.Datetime, fmt="%Y-%m-%d").cast(pl.Datetime))

shape: (100, 2)
┌─────────────────────┬────────┐
│ dates_col           ┆ ticker │
│ ---                 ┆ ---    │
│ datetime[μs]        ┆ str    │
╞═════════════════════╪════════╡
│ 2022-02-25 00:00:00 ┆ RDW    │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 2008-05-28 00:00:00 ┆ ARTX   │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 2015-05-21 00:00:00 ┆ CBAT   │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
│ 2009-02-09 00:00:00 ┆ ANNB   │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤