如何在年份模糊时强制datetime解析为过去的日期?
问题:强制将DD/MM/YY格式的历史日期解析为过去日期
我有一批DD/MM/YY格式的历史日期,均属于过去,但使用datetime.datetime.strptime解析时存在歧义:
- 输入
'01/06/69'会被正确解析为1969年:
>>> datetime.datetime.strptime('01/06/69','%d/%m/%y') datetime.datetime(1969, 6, 1, 0, 0)
- 但输入
'01/06/68'会被解析为2068年(未来日期):
>>> datetime.datetime.strptime('01/06/68','%d/%m/%y') datetime.datetime(2068, 6, 1, 0, 0)
请问datetime模块是否有选项可强制将这类日期解析为过去的日期?
解决方法
Python的datetime模块本身没有直接参数可以自定义%y格式的年份映射规则,但可以通过手动调整实现需求:
方法1:解析后修正未来日期
先按常规方式解析日期,再判断结果是否在当前时间之后,若是则将年份减去100:
import datetime def parse_historical_date(date_str): parsed = datetime.datetime.strptime(date_str, '%d/%m/%y') now = datetime.datetime.now() if parsed > now: parsed = parsed.replace(year=parsed.year - 100) return parsed # 测试 print(parse_historical_date('01/06/68')) # 输出:1968-06-01 00:00:00 print(parse_historical_date('01/06/69')) # 输出:1969-06-01 00:00:00
方法2:预处理年份字符串
直接提取日期中的两位年份,根据规则转换为四位年份后再拼接解析(适合明确所有日期范围的场景):
import datetime def parse_historical_date(date_str): day, month, year_two = date_str.split('/') year = int(year_two) # 强制将两位年份映射到1900-1999(若确定所有日期都是2000年前的历史记录) year += 1900 full_date = f"{day}/{month}/{year}" return datetime.datetime.strptime(full_date, '%d/%m/%Y') # 测试 print(parse_historical_date('01/06/68')) # 输出:1968-06-01 00:00:00
内容的提问来源于stack exchange,提问作者otocan
相关产品推荐
相关产品推荐

