Polars:自定义纳秒精度的日期时间格式化问题
解决方案:Polars将日期时间转换为带1位纳秒精度的格式
问题分析
你的代码存在两个核心问题:
- 使用
%y格式符(两位年份)导致年份显示异常,正确的四位年份格式符应为%Y - 使用
%3f生成了三位微秒后缀(.000),不符合你需要的1位纳秒精度(.0)需求
方案1:转换为带1位纳秒格式的字符串列
如果需要将结果存储为字符串类型并显示.0后缀,直接在strftime中指定完整格式:
import polars as pl # 读取平面文件 df = pl.read_csv("your_file_path.csv") # 转换日期时间列 df = df.with_columns( pl.coalesce( # 先转成Datetime类型,再格式化为带.0的字符串 pl.col("DATETIME_COL") .str.strptime(pl.Datetime, format="%Y-%m-%d %H:%M:%S") .dt.strftime("%Y-%m-%d %H:%M:%S.0"), # 处理空值的默认值 pl.lit("2000-11-11 00:00:00.0") ).alias("DATETIME_COL") )
执行后输出示例:
┌───────────────────────┐ │ DATETIME_COL │ │ --- │ │ str │ ╞═══════════════════════╡ │ 1974-08-08 16:28:51.0 │ │ 1997-12-12 17:56:19.0 │ │ 1986-05-24 09:04:12.0 │ │ 2008-01-13 05:31:57.0 │ │ … │ └───────────────────────┘
方案2:保持纳秒精度的Datetime类型
如果需要列类型仍为Datetime而非字符串,转换时指定time_unit="ns"(纳秒时间单位),Polars会自动显示纳秒精度的后缀:
import polars as pl df = pl.read_csv("your_file_path.csv") df = df.with_columns( pl.coalesce( # 转成纳秒精度的Datetime类型 pl.col("DATETIME_COL") .str.strptime(pl.Datetime, format="%Y-%m-%d %H:%M:%S", time_unit="ns"), # 默认值同样转为纳秒精度Datetime pl.lit("2000-11-11 00:00:00").str.strptime(pl.Datetime, time_unit="ns") ).alias("DATETIME_COL") )
此时列类型为datetime[ns],查看DataFrame时会显示类似1974-08-08 16:28:51.0的格式。
内容的提问来源于stack exchange,提问作者Smruti Prakash Mohanty
相关产品推荐
相关产品推荐

