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

使用Pandas加载Excel文件时无法正确转换日期格式的求助

问题:pandas read_excel解析日期时格式混乱

我使用pandas的read_excel方法加载Excel文件,设置parse_dates=True参数后,日期格式无法正确转换。本地Excel中的日期格式准确,但加载到Python后,一半数据的dmY格式被错误识别为mdY。我需要的输出格式为YYYY-mm-dd HH:MM:SS。

示例数据

df = pd.DataFrame({'ID':[2914240.0,2914137.0,2929456.0,2920801.0],
                   'RT_Date':['2021-01-02 06:38:00','2021-01-02 02:58:00','02-19-2021 17:59:00','2021-09-02 12:49:00'],
                   'DateCreated':['01-31-2021 14:38:12','01-31-2021 10:57:50','02-19-2021 01:58:38','2021-09-02 11:35:51']})

尝试过的代码

df = pd.read_excel('demo.xlsx', parse_dates=True)

问题原因与解决方法

问题原因

parse_dates=True会让pandas自动推断日期格式,但当数据中混杂多种日期格式(比如部分是YYYY-MM-DD、部分是MM-DD-YYYY)时,自动推断逻辑会出错——尤其是当日期的日≤12时,pandas会优先按MM-DD-YYYY解析,导致dmY格式被误判。

解决方法

不要依赖自动推断,手动指定解析规则:

方法1:用dateutil处理多格式解析

先安装依赖库:

pip install python-dateutil

然后自定义解析函数:

from dateutil.parser import parse

# 指定需要解析的日期列,用parse函数处理多种格式
df = pd.read_excel('demo.xlsx', parse_dates=['RT_Date', 'DateCreated'], date_parser=parse)

# 可选:转换为目标字符串格式(若需保持datetime类型用于时间运算,可跳过此步)
df['RT_Date'] = df['RT_Date'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['DateCreated'] = df['DateCreated'].dt.strftime('%Y-%m-%d %H:%M:%S')

方法2:指定所有可能的日期格式(pandas 1.3.0+支持)

如果明确知道数据中的日期格式类型,直接指定多种格式:

df = pd.read_excel('demo.xlsx')

# 对每个日期列转换,列出所有可能的格式
df['RT_Date'] = pd.to_datetime(df['RT_Date'], format=['%Y-%m-%d %H:%M:%S', '%m-%d-%Y %H:%M:%S'])
df['DateCreated'] = pd.to_datetime(df['DateCreated'], format=['%Y-%m-%d %H:%M:%S', '%m-%d-%Y %H:%M:%S'])

# 可选:转换为目标字符串格式
df['RT_Date'] = df['RT_Date'].dt.strftime('%Y-%m-%d %H:%M:%S')
df['DateCreated'] = df['DateCreated'].dt.strftime('%Y-%m-%d %H:%M:%S')

注意事项

  • 检查Excel中的日期类型:如果是Excel自带的日期格式(本质是数值),pandas通常能正确解析;如果是手动输入的文本格式,才会出现格式混杂问题。
  • 若后续需要进行时间运算,建议保留datetime类型,无需转换为字符串;仅当需要固定格式的字符串输出时,再用strftime转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:46:07