Polars读取JSON时日期类型解析失败,如何正确读取Date类型?
问题
我希望从包含标准ISO格式("yyyy-mm-dd")日期的JSON字符串中读取Polars DataFrame。当尝试使用schema或schema_override参数指定日期列的类型为pl.Date时,结果仅返回NULL值。
最小可复现示例(MRE)
from datetime import datetime, timedelta from io import StringIO import polars as pl # 生成日期列表 start_date = datetime.today() dates = [start_date + timedelta(days=i) for i in range(100)] date_strings = [date.strftime("%Y-%m-%d") for date in dates] # 创建Polars DataFrame df = pl.DataFrame({"dates": date_strings}) df_reread = pl.read_json( StringIO(df.write_json()), schema_overrides={"dates": pl.Date}, )
执行print(df_reread)后的输出:
shape: (100, 1) ┌───────┐ │ dates │ │ --- │ │ date │ ╞═══════╡ │ null │ │ null │ │ null │ │ null │ │ null │ │ … │ │ null │ │ null │ │ null │ │ null │ │ null │ └───────┘
问题:是否存在正确从JSON字符串中读取Date类型的方法?
解决方案
方法1:读取后转换列类型
先以字符串类型读取JSON,再通过str.to_date()方法将字符串列转换为pl.Date类型:
df_reread = pl.read_json(StringIO(df.write_json())).with_columns( pl.col("dates").str.to_date("%Y-%m-%d") )
方法2:使用parse_dates参数直接解析
Polars的read_json方法提供了parse_dates参数,指定需要解析的列名后,会自动将ISO格式的日期字符串转换为pl.Date类型:
df_reread = pl.read_json( StringIO(df.write_json()), parse_dates=["dates"] )
方法3:自定义schema配合类型转换
先通过schema指定列的原始类型为字符串,再转换为日期类型:
schema = {"dates": pl.Utf8} df_reread = pl.read_json(StringIO(df.write_json()), schema=schema).with_columns( pl.col("dates").cast(pl.Date) )
失败原因说明
JSON中存储的日期是字符串格式,Polars无法直接将字符串值映射到pl.Date类型,必须显式执行字符串到日期的解析逻辑,上述方法均通过显式解析或内置参数完成了这一步转换。
内容的提问来源于stack exchange,提问作者SysRIP
相关产品推荐
相关产品推荐

