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

pd.to_datetime转换dd-mm-yyyy日期时日月混淆问题求助

解决pandas日期转换格式错误问题

问题分析

你遇到的情况是:指定format='%d-%m-%Y'后,部分日期(如11-02-2022)被错误解析为2022-11-02,而像31-03-2022这类日期能正确解析。这是因为当pandas无法匹配你指定的格式时,会自动切换到日期推断模式:

  • 31-03-2022中31不是合法月份,只能按dd-mm-yyyy解析;
  • 11-02-2022既符合dd-mm-yyyy也符合mm-dd-yyyy,推断时会默认采用美式日期格式(mm-dd-yyyy)。

解决方案

1. 先清理日期列的脏数据

首先检查日期列是否存在隐藏字符(如空格、制表符)或格式不一致的情况:

# 查看前20条日期数据,检查格式
print(data_flights['date'].head(20))

# 清理日期列,去除所有非数字和连字符的字符
data_flights['date'] = data_flights['date'].str.replace(r'[^\d-]', '', regex=True)

2. 严格指定格式并强制报错

使用errors='raise'参数,让pandas在遇到不符合格式的日期时直接抛出异常,方便定位问题数据:

data_flights['date'] = pd.to_datetime(data_flights['date'], format='%d-%m-%Y', errors='raise')
data_flights['month'] = data_flights['date'].dt.month

如果报错,根据提示找到格式错误的行,手动修正或过滤。

3. 从读取CSV时就处理日期(推荐)

在加载数据阶段直接指定日期解析规则,避免后续转换问题:

# 读取时直接解析date列为datetime类型,指定格式
data_economy = pd.read_csv('economy.csv', parse_dates=['date'], date_format='%d-%m-%Y')
data_business = pd.read_csv('business.csv', parse_dates=['date'], date_format='%d-%m-%Y')

# 后续合并和添加字段的代码不变
economy_df = data_economy.assign(ticket_class=0)
business_df = data_business.assign(ticket_class=1)
data_flights = pd.concat([economy_df, business_df])

# 直接提取月份
data_flights['month'] = data_flights['date'].dt.month

额外排查点

如果上述方法无效,检查是否存在以下情况:

  • 数据中混合了两种日期格式(部分dd-mm-yyyy,部分mm-dd-yyyy),可以用str.extract统计格式分布:
    # 统计日、月、年的数值分布
    data_flights['date'].str.extract(r'^(\d{2})-(\d{2})-(\d{4})$').value_counts().head(10)
    
  • 确认没有对date列进行过其他预处理操作,导致格式被篡改。

内容的提问来源于stack exchange,提问作者Sara Marí­a Cano Martí­nez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:57:45