使用pd.to_datetime转换日期列全为NaT,如何提取月份?
解决混合格式日期列提取月份的问题
问题原因
pd.to_datetime默认无法自动识别这种纯月份缩写/日-月份缩写的混合格式,因此返回全量NaT。以下是两种可靠的解决方法:
方法一:提取月份缩写直接映射(推荐,更稳定)
这种方法跳过完整日期解析,直接提取核心的月份缩写并映射为目标格式,适合仅需月份的场景:
提取字符串中的月份缩写
用正则匹配字符串里的3位月份缩写(不管前面是否有日和横杠):df['month_abbr'] = df['date'].str.extract(r'([A-Za-z]{3})', expand=False)创建月份映射字典
定义缩写到两位数月份的对应关系:month_map = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12' }映射并处理缺失值
将匹配到的缩写转成月份,无法识别的替换为指定文本:df['month'] = df['month_abbr'].map(month_map).fillna('Date not given')
方法二:指定多格式解析日期
通过给pd.to_datetime传递格式列表,让它尝试多种规则解析混合格式:
解析混合格式日期
同时适配纯月份缩写(%b)和日-月份缩写(%d-%b)两种格式:df['date_parsed'] = pd.to_datetime(df['date'], errors='coerce', format=['%b', '%d-%b'])提取月份并处理缺失值
用dt.strftime('%m')生成两位数月份,缺失值替换为指定文本:df['month'] = df['date_parsed'].dt.strftime('%m').fillna('Date not given')
完整示例代码
import pandas as pd # 测试数据 data = {'date': ['Oct', 'Jun', '15-Oct', '27-Nov', '26-Sep', 'invalid_value']} df = pd.DataFrame(data) # 方法一实现 df['month_abbr'] = df['date'].str.extract(r'([A-Za-z]{3})', expand=False) month_map = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12' } df['month_method1'] = df['month_abbr'].map(month_map).fillna('Date not given') # 方法二实现 df['date_parsed'] = pd.to_datetime(df['date'], errors='coerce', format=['%b', '%d-%b']) df['month_method2'] = df['date_parsed'].dt.strftime('%m').fillna('Date not given') # 输出结果 print(df[['date', 'month_method1', 'month_method2']])
输出结果:
date month_method1 month_method2 0 Oct 10 10 1 Jun 06 06 2 15-Oct 10 10 3 27-Nov 11 11 4 26-Sep 09 09 5 invalid_value Date not given Date not given
内容的提问来源于stack exchange,提问作者Saintisdata23
相关产品推荐
相关产品推荐

