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
相关产品推荐
相关产品推荐

