使用Python从格式不固定的日期中提取年份的技术问题
解决日期格式不固定时提取年份的问题
哈哈,这个坑我踩过!用max(d.split('-'))这种方法确实太容易出问题了——字符串比较逻辑和数字完全不一样,像"22"这种字符串会被判定为比"2017"大,而且还没法兼容/这类其他分隔符。给你两个稳一点的解决方案:
方法1:用Python标准库datetime(无需额外安装)
我们可以预先列出所有可能的日期格式,然后逐个尝试解析,成功后提取年份:
from datetime import datetime def get_year_from_date(date_str): # 覆盖所有可能遇到的格式,后续可以根据新增格式补充 possible_formats = ['%Y', '%Y-%m', '%Y-%m-%d', '%Y/%m', '%Y/%m/%d'] for fmt in possible_formats: try: parsed_date = datetime.strptime(date_str, fmt) return parsed_date.year except ValueError: # 当前格式不匹配,继续尝试下一个 continue # 如果所有格式都无法解析,抛出异常或返回默认值(根据你的需求调整) raise ValueError(f"无法识别的日期格式:{date_str}")
这个方法的优势是不需要额外安装依赖,而且逻辑可控,你可以随时添加新的日期格式到列表里。
方法2:用第三方库python-dateutil(更省心)
如果你的项目允许安装第三方库,dateutil.parser能自动识别绝大多数常见的日期格式,不用手动维护格式列表:
from dateutil.parser import parse def get_year_from_date(date_str): # 自动解析日期字符串,直接提取年份 return parse(date_str).year
这个方法灵活性拉满,就算服务器后续返回带时间的日期(比如2019/10/20 14:30)或者其他变种格式,它基本都能正确识别。
为什么之前的方法不行?
你之前用max(d.split('-'))的问题在于:
- 字符串比较是按字符逐个对比的,"22"和"2017"比的时候,第二个字符'2' > '0',所以会误判"22"更大
- 只能处理
-分隔的格式,遇到/或者其他分隔符直接失效
只有把字符串转换成真正的日期对象,再提取年份,才能从根本上避免这些问题。
内容的提问来源于stack exchange,提问作者DmVinny
相关产品推荐
相关产品推荐

