Pandas如何将DataFrame列中混合格式日期统一为dd.mm.yyyy格式
Pandas混合日期格式统一转换方案
问题原因
pd.to_datetime()默认自动推断日期格式时,对分隔符对应的日期顺序判定规则不固定:针对点分隔的日期字符串,会默认优先按照mm.dd.yyyy规则解析,当日数值≤12时就会出现日月互换的错位问题。另外原有代码中dt.strftime()的执行结果没有赋值回DataFrame列,即使解析正确也不会修改原数据。
输入数据样例
invoiceDate列原始数据混杂两种格式:
0 16.09.2014 1 2014-09-16 2 02.12.2014 3 2014-12-02 4 09.01.2018 183 2015-03-30 184 12.04.2017 185 2017-04-12 186 28.12.2018 187 2018-12-28 Name: invoiceDate, Length: 188, dtype: object
稳定兼容的实现代码
通过分隔符拆分两类日期,分别指定解析规则,完全避免自动推断的错误,兼容所有Pandas版本:
import pandas as pd # 按分隔符区分两类日期 is_dot_format = df['invoiceDate'].str.contains('.', regex=False) # 点分隔格式严格按照dd.mm.yyyy解析 parsed_dot = pd.to_datetime( df.loc[is_dot_format, 'invoiceDate'], format='%d.%m.%Y', errors='coerce' ) # 横杠分隔格式严格按照yyyy-mm-dd解析 parsed_dash = pd.to_datetime( df.loc[~is_dot_format, 'invoiceDate'], format='%Y-%m-%d', errors='coerce' ) # 合并结果后统一格式化为目标格式,赋值回原列 df['invoiceDate'] = pd.concat([parsed_dot, parsed_dash]).sort_index().dt.strftime('%d.%m.%Y')
简便写法(适配Pandas 2.0+版本)
如果运行环境为Pandas 2.0及以上版本,可以直接用混合格式解析参数,指定日优先规则实现快速转换:
df['invoiceDate'] = pd.to_datetime( df['invoiceDate'], format='mixed', dayfirst=True, errors='coerce' ).dt.strftime('%d.%m.%Y')
输出结果
执行后所有日期会统一为%d.%m.%Y格式,和预期完全一致:
0 16.09.2014 1 16.09.2014 2 02.12.2014 3 02.12.2014 4 09.01.2018 183 30.03.2015 184 12.04.2017 185 12.04.2017 186 28.12.2018 187 28.12.2018 Name: invoiceDate, Length: 188, dtype: object
内容的提问来源于stack exchange,提问作者ysmnrn.csv
相关产品推荐
相关产品推荐

