Polars中无法将字符串类型转换为纯日期格式问题求助
从带时间的字符串日期列提取日期部分的解决方案
问题背景
我尝试从字符串类型的datetime列中提取仅date部分,但未得到正确结果。不确定日期中的单数字格式是否会引发问题?
数据示例
import polars as pl df = pl.from_repr(""" ┌──────┬──────────────────────┐ │ YEAR ┆ FL_DATE │ │ --- ┆ --- │ │ i64 ┆ str │ ╞══════╪══════════════════════╡ │ 2023 ┆ 1/1/2023 12:00:00 AM │ │ 2023 ┆ 1/1/2023 12:00:00 AM │ │ 2023 ┆ 1/1/2023 12:00:00 AM │ └──────┴──────────────────────┘ """)
失败尝试及输出
尝试代码
# 尝试1 df.select( pl.col('FL_DATE').alias('date_only').str.to_date("%m/%d/%Y") ) # 尝试2 df.select( pl.col('FL_DATE').alias('date_only').str.to_date("%m/%d/%Y").dt.to_string("%Y-%m") ) # 尝试3 df.select( pl.col('FL_DATE').alias('date_only').str.to_datetime("%m/%d/%Y",strict=False).cast(pl.Date) ) # 尝试4 df.select( pl.col('FL_DATE').cast(pl.String).str.to_datetime("%m/%d/%Y",strict=False ).cast(pl.Date).alias('date_only') )
对应失败输出
1. InvalidOperationError: conversion from `str` to `date` failed in column 'date_only' 2. InvalidOperationError: conversion from `str` to `date` failed in column 'date_only' 3. null 4. null
问题原因
失败的核心原因是格式字符串没有匹配原字符串的完整结构。原FL_DATE列的字符串包含日期和时间部分(比如1/1/2023 12:00:00 AM),但你使用的%m/%d/%Y只匹配日期部分,导致解析失败。单数字的月/日格式不是问题,Polars的日期解析支持单数字的月和日。
可行解决方案
方法1:用完整格式字符串解析后转日期
直接使用包含时间的格式字符串解析为datetime,再转为date类型:
df.select( pl.col('FL_DATE').str.to_datetime("%m/%d/%Y %I:%M:%S %p").cast(pl.Date).alias('date_only') )
格式说明:
%m/%d/%Y:匹配月/日/年(支持单数字格式)%I:%M:%S:匹配12小时制的时:分:秒%p:匹配AM/PM标识
方法2:先截取日期部分再解析
通过字符串分割提取纯日期部分,再解析为date类型:
df.select( pl.col('FL_DATE').str.split(" ").first().str.to_date("%m/%d/%Y").alias('date_only') )
这里用空格分割字符串,取第一个元素(即纯日期部分),再用%m/%d/%Y解析即可。
方法3:自动推断格式解析
如果日期格式标准,可以关闭严格模式让Polars自动推断格式:
df.select( pl.col('FL_DATE').str.to_datetime(strict=False).cast(pl.Date).alias('date_only') )
验证结果
以上三种方法都能得到正确的日期列,输出示例:
┌────────────┐ │ date_only │ │ --- │ │ date │ ╞════════════╡ │ 2023-01-01 │ │ 2023-01-01 │ │ 2023-01-01 │ └────────────┘
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

