使用Pandas导入Excel时如何正确解析欧洲格式日期?
问题描述
作为数据工程师,在将Excel xlsx文件导入SQL Server数据库表时遇到以下问题:
- 数据源采用**dd/mm/yyyy(欧洲格式)**输入日期
- 当日份大于12时,Excel将日期识别为文本(例如
31/03/2024),Pandas读取后能正确解析为2024-03-31 - 当日份为12或更小时,Excel将其识别为日期类型(例如
06/04/2024会被Excel识别为6月4日),Pandas读取后转为2024-06-04,与实际的4月6日不符 - 无法在Excel存入目标文件夹前修改文件,需确保每次都能正确解析日期并导入数据库
解决方案
核心分析
Excel对日期的识别逻辑导致Pandas读取后出现两种格式:
- 当Excel识别为日期类型(日份≤12),Pandas读取后转为
yyyy-mm-dd HH:MM:SS格式的字符串 - 当Excel无法识别为日期(日份>12),Pandas直接读取为
dd/mm/yyyy格式的字符串
实现代码
通过自定义解析函数,统一处理两种格式的日期:
from datetime import datetime, timedelta import pandas as pd DATE_PATTERNS = ["%Y-%d-%m %H:%M:%S", "%d/%m/%Y"] def excel_date_parser(val): """ 解析Excel日期类型转换后的字符串和dd/mm/yyyy格式的文本日期 """ # 兼容Excel日期序列号(若读取时未指定dtype=str可能出现) if isinstance(val, float) or isinstance(val, int): return datetime(1899, 12, 30) + timedelta(days=val) else: try: return try_to_datetime(val) except Exception as e: print(f"解析{val}时出错: {e}") return None def try_to_datetime(val): for fmt in DATE_PATTERNS: try: return pd.to_datetime(val, format=fmt, errors='raise') except: continue raise ValueError(f"无法解析日期值: {val}") # 读取Excel时强制将Date列按字符串读取,避免自动转换 df = pd.read_excel("file_with_Euro_dates.xlsx", dtype={"Date": str}) # 应用自定义解析函数统一处理日期 df["Date"] = df["Date"].apply(excel_date_parser) # 后续可将处理后的DataFrame导入SQL Server
内容的提问来源于stack exchange,提问作者Peter Martinson
相关产品推荐
相关产品推荐

