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

如何用Python统一SAP导出Excel中混合日期格式至DataFrame

问题描述

从SAP平台导出的Excel文件中,日期列存在多种混合格式问题:

  • 原始导出格式通常为dd/mm/yyyy,偶尔会出现dd.mm.yyyy
  • 读取到DataFrame后,该列同时存在datetime对象和字符串格式的日期,具体表现为三种格式:
    • dd/mm/yyyy hh:mm(CSV显示)| dd-mm-yyyy hh:mm(Excel显示)
    • dd/mm/yyyy
    • mm/dd/yyyy hh:mm(CSV显示)| mm-dd-yyyy hh:mm(Excel显示)
  • 经分析:1月1日-12日的日期被错误识别为mm/dd/yyyy hh:mm,13日-20日为dd/mm/yyyy,21日-31日为dd/mm/yyyy hh:mm
  • 使用pd.to_datetime(df["列名"], dayfirst=True)无法正确识别,导致1月1日-12日的数据丢失
解决方案

通过统一字符串格式→强制按日优先解析→格式化输出的流程处理,具体代码如下:

import pandas as pd

# 读取Excel时强制按字符串类型加载日期列,避免自动错误解析
excel_data = pd.read_excel(
    "Reportes/Crudos/Reporte SAP.xlsx", 
    header=1, 
    dtype={"Asiento contable (Fecha de contabilización)": str}
)

date_col = "Asiento contable (Fecha de contabilización)"

# 步骤1:统一分隔符,把点分隔的日期转换成斜杠分隔
excel_data[date_col] = excel_data[date_col].str.replace(".", "/", regex=False)

# 步骤2:解析混合格式的日期,强制日在前的解析逻辑
# Pandas 2.0+版本用format="mixed"自动匹配多种格式
excel_data[date_col] = pd.to_datetime(
    excel_data[date_col],
    dayfirst=True,
    format="mixed",
    errors="coerce"  # 可选:无法解析的值转为NaT,后续可单独处理
)

# 步骤3:统一格式化为dd/mm/yyyy字符串
excel_data[date_col] = excel_data[date_col].dt.strftime("%d/%m/%Y")

# 验证处理结果
print(excel_data[date_col].unique())

# 保存处理后的文件
excel_data.to_csv("Reportes/Crudos/processed_report.csv", index=False)
excel_data.to_excel("Reportes/Crudos/processed_report.xlsx", index=False)

低版本Pandas兼容方案(<2.0)

如果你的Pandas版本低于2.0,没有format="mixed"参数,可手动指定所有可能的格式:

excel_data[date_col] = pd.to_datetime(
    excel_data[date_col],
    dayfirst=True,
    formats=["%d/%m/%Y %H:%M", "%d/%m/%Y", "%m/%d/%Y %H:%M"],
    errors="coerce"
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:28:13