You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars中替换全空日期列'0001-01-01'为Null报错的解决问询

问题:Polars处理全Null日期列替换时的报错解决

需求:对所有pl.Date类型列执行替换操作,将0001-01-01替换为Null。但全为Null的日期列执行map_elements时会抛出AttributeError: 'DataFrame' object has no attribute '_pyexpr'错误,且这类列无法删除,需保留后续使用。

解决方案

方法1:提前筛选非全Null的日期列处理

先识别出非全Null的日期列,仅对这些列应用自定义函数,再合并原DataFrame的其他列:

import polars as pl
import datetime

replace_func = lambda date: None if date == datetime.date(1,1,1) else date

df = pl.DataFrame({
    'A':[datetime.date(2023,3,3),datetime.date(1,1,1),None],
    'B':[1,1,3],
    'C':[None,None,None]
})

# 获取所有日期类型列
date_cols = df.select(pl.col(pl.Date)).columns
# 筛选出非全Null的日期列(空值数不等于总行数)
non_null_date_cols = [col for col in date_cols if df.select(col).null_count().item() != df.height]

# 仅处理非全Null日期列,保留其他列不变
result_df = df.with_columns(
    pl.col(non_null_date_cols).map_elements(replace_func)
)

print(result_df)

方法2:改用Polars原生表达式(推荐)

放弃map_elements,用Polars原生的when/then/otherwise语法实现替换,原生表达式对全Null列兼容性更好,无需额外筛选:

import polars as pl
import datetime

df = pl.DataFrame({
    'A':[datetime.date(2023,3,3),datetime.date(1,1,1),None],
    'B':[1,1,3],
    'C':[None,None,None]
})

# 原生表达式实现替换,自动兼容全Null列
result_df = df.with_columns(
    pl.col(pl.Date)
    .when(pl.col(pl.Date) == datetime.date(1,1,1))
    .then(None)
    .otherwise(pl.col(pl.Date))
)

print(result_df)

说明

  • 方法1适用于必须使用自定义lambda函数的场景,通过提前过滤避免报错
  • 方法2性能更优,且无需处理列筛选逻辑,是Polars的推荐写法

内容的提问来源于stack exchange,提问作者SysRIP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:07:06