使用Polars从特殊格式Datetime提取日期失败的问题求助
错误原因与解决方法
错误原因
你使用str.strptime(pl.Date, '%Y-%m-%d')时,指定的格式串%Y-%m-%d仅能匹配纯日期字符串,但输入的是包含时分秒、毫秒的完整ISO时间字符串。Polars的strptime默认启用严格模式(strict=True),要求输入字符串与格式串完全匹配,时间部分的存在导致解析失败,因此抛出ComputeError。
解决方法
以下是三种可行的解决方案:
方案1:先转Datetime再提取日期
利用Polars对ISO标准时间格式的自动识别能力,先将字符串转为pl.Datetime类型,再提取日期部分:
import polars as pl df = pl.DataFrame(['2023-08-01T06:13:24.448409', '2023-08-01T07:29:34.491027']) # 方式1:转Datetime后用dt.date()提取日期 result = df.with_columns(pl.col('column_0').str.strptime(pl.Datetime).dt.date()) # 方式2:转Datetime后直接转为Date类型 result = df.with_columns(pl.col('column_0').str.strptime(pl.Datetime).cast(pl.Date)) print(result)
方案2:匹配完整格式串后转Date
如果要坚持用strptime直接解析,需要写出包含时间部分的完整格式串,再转为Date类型:
import polars as pl df = pl.DataFrame(['2023-08-01T06:13:24.448409', '2023-08-01T07:29:34.491027']) result = df.with_columns(pl.col('column_0').str.strptime(pl.Datetime, '%Y-%m-%dT%H:%M:%S.%f').cast(pl.Date)) print(result)
方案3:直接截取日期子串
由于日期部分固定为字符串前10位,可直接截取后转Date:
import polars as pl df = pl.DataFrame(['2023-08-01T06:13:24.448409', '2023-08-01T07:29:34.491027']) result = df.with_columns(pl.col('column_0').str.slice(0, 10).str.strptime(pl.Date, '%Y-%m-%d')) print(result)
内容的提问来源于stack exchange,提问作者INGl0R1AM0R1
相关产品推荐
相关产品推荐

