Pandas使用%y解析日期默认转为20xx而非19xx的问题求助
解决Pandas两位数年份转换为19xx而非20xx的问题
当使用pd.to_datetime(df['date'], format='%d.%m.%y')处理28.01.58时,Pandas默认将00-69区间的两位数年份映射到2000-2069,所以得到2058-01-28。要得到期望的1958-01-28,可以用以下几种方法:
方法1:转换后批量调整年份
先完成初始转换,再对超过阈值的年份减去100年(阈值可根据业务需求调整,比如设为2030):
import pandas as pd df['date'] = pd.to_datetime(df['date'], format='%d.%m.%y') # 对年份大于2030的日期,减去100年 df.loc[df['date'].dt.year > 2030, 'date'] -= pd.DateOffset(years=100)
方法2:自定义函数处理单个日期
通过datetime模块手动判断并调整年份,适合需要更精细控制的场景:
from datetime import datetime, timedelta import pandas as pd def fix_year(date_str): dt = datetime.strptime(date_str, '%d.%m.%y') # 若年份超过当前年份(示例为2024),则减100年 if dt.year > 2024: dt -= timedelta(days=36524) # 近似100年的天数 return dt df['date'] = df['date'].apply(fix_year)
方法3:提前补全年份为四位数
直接修改日期字符串,将两位数年份补全为四位数后再转换:
import pandas as pd # 对末尾两位数年份,小于60则补19,否则补20 df['date'] = pd.to_datetime( df['date'].str.replace(r'(\d{2})$', lambda m: '19' + m.group(1) if int(m.group(1)) < 60 else '20' + m.group(1)), format='%d.%m.%Y' )
内容的提问来源于stack exchange,提问作者Joan Arau
相关产品推荐
相关产品推荐

