如何用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/yyyymm/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
相关产品推荐
相关产品推荐

