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

Pandas 2+PyArrow未转换MM/DD/YYYY格式日期的原因及解决方法

Pandas 2+ PyArrow后端读取CSV时MM/DD/YYYY格式日期未自动识别为date32类型的问题解决

问题背景

使用版本环境:

  • Pandas 2.1.1
  • NumPy 1.26.2
  • PyArrow 14.0.1

执行CSV读取代码:

import pandas as pd
import pyarrow as pa
df_date_test = pd.read_csv(core_test, engine="pyarrow", dtype_backend="pyarrow")

出现以下识别差异:

  • YYYY-MM-DD格式的字段(如date1)被自动识别为date32[day][pyarrow]类型
  • MM/DD/YYYY格式的字段(如date2,示例值"10/18/2006")被识别为string[pyarrow]类型,即便该字段有341712条非空值

原因分析

  1. PyArrow的CSV类型推断逻辑默认仅优先识别ISO标准日期格式(YYYY-MM-DD),对于非ISO格式的日期(如MM/DD/YYYY)不会自动推断为日期类型,仅保留为字符串。
  2. Pandas使用PyArrow引擎读取CSV时,完全依赖PyArrow底层的推断规则,没有额外对非标准日期格式做自动识别处理。

解决方案

方法1:读取时直接指定日期格式(推荐)

通过read_csv的parse_dates和date_format参数,明确指定目标字段的日期格式,读取后直接得到date32[day][pyarrow]类型:

# 转换单个MM/DD/YYYY格式字段
df_date_test = pd.read_csv(
    core_test,
    engine="pyarrow",
    dtype_backend="pyarrow",
    parse_dates=["date2"],
    date_format={"date2": "%m/%d/%Y"}
)

# 批量转换多个同格式字段
df_date_test = pd.read_csv(
    core_test,
    engine="pyarrow",
    dtype_backend="pyarrow",
    parse_dates=["date1", "date2"],
    date_format={"date1": "%m/%d/%Y", "date2": "%m/%d/%Y"}
)

方法2:读取后转换字段类型

如果已将字段读取为字符串类型,可使用pd.to_datetime结合dtype_backend参数转换为目标类型:

# 转换单个字段
df_date_test["date2"] = pd.to_datetime(
    df_date_test["date2"],
    format="%m/%d/%Y",
    dtype_backend="pyarrow"
)

# 验证转换结果
print(df_date_test["date2"].dtype)  # 输出:date32[day][pyarrow]

注意事项

  • 确保格式字符串%m/%d/%Y与实际数据格式完全匹配,若数据包含时间部分,需调整为%m/%d/%Y %H:%M:%S等对应格式。
  • 若数据中存在格式不规范的日期值,可添加errors="coerce"参数将无效值转为NaT,但需提前评估数据质量影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:10:13