如何在Pandas中将19、2019格式的年份统一转换为2019格式?
统一转换混合格式年份为四位格式的解决方法
问题原因
你执行pd.to_datetime(chelsea["Year"], format="%y")报错,是因为%y强制要求输入为两位年份,而列中存在四位年份(如2019),无法被完全解析,因此触发ValueError。
解决方案
方法1:按字符串长度补全(明确世纪范围)
如果确定两位年份都属于20xx(比如19对应2019),可以直接按字符串长度补全:
# 转为字符串类型,确保统一处理 chelsea['Year'] = chelsea['Year'].astype(str) # 两位年份补全为四位,四位年份保持不变 chelsea['Year'] = chelsea['Year'].apply(lambda x: f"20{x}" if len(x) == 2 else x) # 转换为整数类型的四位年份(或保留datetime类型) chelsea['Year'] = pd.to_numeric(chelsea['Year'], errors='coerce')
如果两位年份属于19xx(比如93对应1993),只需把f"20{x}"改成f"19{x}"即可。
方法2:异常捕获自动解析(鲁棒性强)
如果需要自动推断两位年份对应的世纪(Python默认规则:00-69→2000-2069,70-99→1970-1999),可以用try-except处理:
def parse_year(year_val): try: # 尝试解析两位年份 return pd.to_datetime(year_val, format="%y").year except ValueError: # 失败则解析四位年份 return pd.to_datetime(year_val, format="%Y").year # 应用函数转换 chelsea['Year'] = chelsea['Year'].apply(parse_year)
这种方法能自动适配两种格式,无需手动指定世纪,适合多数通用场景。
方法3:提取数字后统一处理(应对脏数据)
如果列中存在非数字干扰字符(比如19年、2019.),先提取纯数字再处理:
# 提取字符串中的所有数字字符 chelsea['Year'] = chelsea['Year'].astype(str).str.extract(r'(\d+)', expand=False) # 按长度补全或保留 chelsea['Year'] = chelsea['Year'].apply( lambda x: x if len(x) == 4 else f"20{x}" if len(x) == 2 else None ) # 转为数值类型,无效值设为NaN chelsea['Year'] = pd.to_numeric(chelsea['Year'], errors='coerce')
内容的提问来源于stack exchange,提问作者Muhammad Anas Atiq
相关产品推荐
相关产品推荐

