数据清洗问询:为无年份日期补全年份的代码优化方案
优化日期补全年份的实现方案
你已经搞定了核心功能,这里分享几个更简洁、易维护的优化思路,完美适配你提到的规则:1-3月补2018年,其余月份补2017年(数据范围为2017年4月及以后)。
方案一:利用datetime模块简化逻辑
直接借助datetime的内置解析能力处理英文月份,再通过月份数字判断补全年份,代码紧凑且不易出错:
from datetime import datetime def add_year_to_date(date_str): # 先解析出日和月(临时年份不影响月份判断) temp_date = datetime.strptime(date_str, "%d %B") # 根据月份规则匹配年份 year = 2018 if temp_date.month in (1, 2, 3) else 2017 # 格式化输出统一格式的完整日期 return temp_date.strftime(f"%d %B {year}") # 测试示例 print(add_year_to_date("15 March")) # 输出: 15 March 2018 print(add_year_to_date("20 April")) # 输出: 20 April 2017
这个方案的优势:
- 不用手动维护英文月份和数字的映射,依赖内置工具减少出错概率
- 逻辑清晰直白,新手也能快速看懂
- 输出格式和输入完全匹配,不会出现格式偏差
方案二:预定义映射实现极致性能
如果要处理超大规模数据集,字典查找的O(1)性能会更有优势,直接预定义月份到年份的映射关系:
# 提前把所有英文月份对应的年份映射好 MONTH_YEAR_MAP = { "January": 2018, "February": 2018, "March": 2018, "April": 2017, "May": 2017, "June": 2017, "July": 2017, "August": 2017, "September": 2017, "October": 2017, "November": 2017, "December": 2017 } def add_year_to_date(date_str): day, month = date_str.split() return f"{day} {month} {MONTH_YEAR_MAP[month]}" # 测试示例 print(add_year_to_date("15 March")) # 输出: 15 March 2018 print(add_year_to_date("20 April")) # 输出: 20 April 2017
这个方案的优势:
- 性能拉满,适合处理百万级以上的数据集
- 映射关系一目了然,后续要调整年份规则时,直接修改字典就行,扩展性极强
方案三:兼容多种输入格式的鲁棒版本
如果你的输入可能混有缩写月份(比如"Mar"代替"March"),可以做一个兼容多种格式的版本:
from datetime import datetime def add_year_to_date(date_str): # 先尝试完整月份格式,失败就用缩写格式解析 try: temp_date = datetime.strptime(date_str, "%d %B") except ValueError: temp_date = datetime.strptime(date_str, "%d %b") year = 2018 if temp_date.month <= 3 else 2017 # 统一输出完整月份格式,保证数据一致性 return temp_date.strftime(f"%d %B {year}") # 测试示例 print(add_year_to_date("15 Mar")) # 输出: 15 March 2018 print(add_year_to_date("20 Apr")) # 输出: 20 April 2017
这个方案的优势:
- 兼容完整月份和缩写月份两种输入,鲁棒性拉满
- 输出统一为完整月份格式,避免数据格式混乱
选择建议
- 追求代码简洁、可读性优先:选方案一
- 处理超大量数据、要极致性能:选方案二
- 输入格式不固定、需要兼容多种情况:选方案三
内容的提问来源于stack exchange,提问作者user31735
相关产品推荐
相关产品推荐

