Python如何动态处理日、周、月、季度等不同格式的DateTime字符串
日期格式转换方案
Python标准库没有能直接匹配你当前业务自定义转换规则的内置函数,dateutil的通用解析逻辑也没法直接适配周、月、季度取固定起始日期的业务需求,不过也不需要手动维护全量的日期格式映射表,只要按四类格式的特征做分支判断处理即可,四类格式的区分特征非常明显,处理逻辑如下:
- 季度格式:特征为包含
Q字符,先提取年份和季度数字,按规则映射即可:Q1对应[年份]-01-01,Q2对应[年份]-04-01,Q3对应[年份]-07-01,Q4对应[年份]-10-01 - 周格式:特征为带有
Week of前缀,提取前缀后的月日字符串解析后直接输出即可,无年份的场景按业务规则补全对应年份 - 月格式:特征为包含表示年份的撇号后缀(
’),解析后取当月1号作为输出值 - 日格式:排除以上三类特征后即可归为日格式,直接解析补全年份输出即可
你可以参考以下简化实现代码:
from datetime import datetime import re def custom_date_parser(date_str: str, default_year: int = datetime.now().year) -> str: # 处理季度格式 if 'Q' in date_str: year, q = re.match(r'(\d{4}) Q(\d)', date_str).groups() quarter_start_month = (int(q) - 1) * 3 + 1 return f"{year}-{quarter_start_month:02d}-01" # 处理周格式 elif date_str.startswith('Week of '): date_part = date_str.replace('Week of ', '') dt = datetime.strptime(f"{date_part} {default_year}", "%b %d %Y") return dt.strftime("%Y-%m-%d") # 处理月格式 elif '’' in date_str: dt = datetime.strptime(date_str.replace('’', ''), "%b %y") return dt.strftime("%Y-%m-01") # 处理日格式 else: dt = datetime.strptime(f"{date_str} {default_year}", "%b %d %Y") return dt.strftime("%Y-%m-%d") # 测试示例 print(custom_date_parser("Oct 24", 2021)) # 输出 2021-10-24 print(custom_date_parser("Week of Oct 18", 2021)) # 输出 2021-10-18 print(custom_date_parser("Oct ’21")) # 输出 2021-10-01 print(custom_date_parser("2021 Q3")) # 输出 2021-07-01
如果后续新增其他格式,只要补充对应的特征判断分支和处理逻辑即可,不需要维护全量的格式映射表。
内容的提问来源于stack exchange,提问作者terraCoder
相关产品推荐
相关产品推荐

