如何在Polars中基于datetime字符串列创建weekofyear等衍生列?
解决Polars中从datetime字符串提取时间字段的问题
错误原因
你使用%Y作为str.to_datetime()的格式参数,但starttime列是完整的ISO格式datetime字符串(如2022-02-10 09:32:20),%Y仅匹配年份部分,无法解析完整的datetime结构,导致转换失败。
正确实现方式
Polars可以自动识别标准ISO格式的datetime字符串,无需手动指定格式。先将字符串转换为datetime类型,再通过dt命名空间提取所需的时间字段:
方式1:直接一次性提取所有字段
import polars as pl df = pl.from_repr(""" ┌─────────────────────┬─────────────────────┬────────────┬───────────┬─────────┐ │ starttime ┆ endtime ┆ storageid ┆ volume_id ┆ avgiops │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str ┆ i64 │ ╞═════════════════════╪═════════════════════╪════════════╪═══════════╪═════════╡ │ 2022-02-10 09:32:20 ┆ 2022-02-10 09:34:28 ┆ TUNYKYPG72 ┆ 4c8d6c31 ┆ 27 │ │ 2022-02-10 10:34:10 ┆ 2022-02-10 10:35:12 ┆ TUNYKYPG42 ┆ 4c8d6d31 ┆ 34 │ └─────────────────────┴─────────────────────┴────────────┴───────────┴─────────┘ """) # 提取year、month、dayofweek、weekofyear列 df = df.with_columns( pl.col('starttime').str.to_datetime().dt.year().alias('year'), pl.col('starttime').str.to_datetime().dt.month().alias('month'), pl.col('starttime').str.to_datetime().dt.day_of_week().alias('dayofweek'), pl.col('starttime').str.to_datetime().dt.week().alias('weekofyear') ) print(df)
方式2:先转换一次datetime列,再复用提取(更高效)
避免重复转换字符串,先生成一个datetime类型的中间列,再基于它提取字段:
df = df.with_columns( start_datetime = pl.col('starttime').str.to_datetime() ).with_columns( year = pl.col('start_datetime').dt.year(), month = pl.col('start_datetime').dt.month(), dayofweek = pl.col('start_datetime').dt.day_of_week(), weekofyear = pl.col('start_datetime').dt.week() )
字段说明
dt.year():提取年份(如2022)dt.month():提取月份(1-12)dt.day_of_week():提取星期几,默认遵循ISO标准(0=周一,6=周日),若需周日为0,可指定参数dt.day_of_week(week_start=7)dt.week():提取ISO周数(一年中第几个周,第一周需包含至少4天)
内容的提问来源于stack exchange,提问作者Samselvaprabu
相关产品推荐
相关产品推荐

