在Pandas中将含两位年份的月年字符串转换为datetime类型
解决两位年份的字符串转datetime问题
问题分析
你遇到的核心问题是两位年份的世纪推断和明确解析格式。直接调用pd.to_datetime()时,pandas可能无法正确识别Jan-98这类格式的世纪归属,或者因格式推断模糊导致解析错误;而你第二次尝试的格式串%m-%Y缺少日期部分,也不符合期望输出。
解决方案
需要明确指定解析格式,并通过cutoff参数控制两位年份的世纪划分,最后格式化为目标字符串格式:
import pandas as pd # 原始数据 data = { 'month_year': [ 'Jan-98', 'Feb-98', 'Mar-99', 'Apr-99', 'May-99', 'Oct-00', 'Nov-00', 'Jun-01', 'Aug-03', 'Sep-08', 'Dec-21', 'Jul-22' ] } df = pd.DataFrame(data) # 转换并格式化 df['month_year'] = pd.to_datetime( df['month_year'], format='%b-%y', # 明确格式:月份缩写-两位年份 cutoff=pd.Timestamp('2000-01-01') # 指定世纪划分:<=00的年份归20xx,>00的归19xx ).dt.strftime('%d-%m-%Y') # 格式化为日-月-年,日固定为01 print(df)
代码说明
format='%b-%y':告诉pandas按「月份缩写(如Jan)-两位年份(如98)」的规则解析字符串,避免格式推断错误。cutoff=pd.Timestamp('2000-01-01'):控制世纪推断逻辑:两位年份值≤00时解析为20xx,>00时解析为19xx,完美匹配你的期望(98→1998,00→2000,21→2021)。dt.strftime('%d-%m-%Y'):将datetime对象格式化为「日-月-年」的字符串,其中%d固定为01(因为原始数据没有日期信息,默认取每月第一天)。
输出结果
month_year 0 01-01-1998 1 01-02-1998 2 01-03-1999 3 01-04-1999 4 01-05-1999 5 01-10-2000 6 01-11-2000 7 01-06-2001 8 01-08-2003 9 01-09-2008 10 01-12-2021 11 01-07-2022
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

