如何获取dateutil.parser解析日期时使用的指令?如返回'%Y/%m/%d %H:%M'
关于dateutil.parser获取解析格式指令的解决方案
嘿,这个问题问得挺实用的!不过得先明确一点:dateutil.parser本身并没有直接返回解析时所用格式字符串的功能——因为它是靠启发式规则来识别日期的,不是通过匹配预设的格式模板工作,所以没办法直接拿到像%Y/%m/%d %H:%M这样的指令。
不过别担心,我给你两个可行的思路来实现类似需求:
思路1:反向生成格式字符串(适合规范输入场景)
如果你的输入日期格式比较固定,你可以先解析得到datetime对象,再根据输入的格式规则反向生成对应的格式字符串。举个例子:
from dateutil import parser from datetime import datetime # 示例输入日期 date_str = "2024/05/20 14:30" # 解析日期 parsed_dt = parser.parse(date_str) # 根据输入格式手动指定对应的strftime格式(如果输入格式固定,这一步很可靠) target_format = "%Y/%m/%d %H:%M" # 验证:用生成的格式还原日期字符串 print(parsed_dt.strftime(target_format)) # 输出:2024/05/20 14:30
需要注意的是,这个方法是基于解析后的datetime对象反向生成,不是直接获取解析时用的原始格式,但对于格式规范的输入,完全能满足你的需求。
思路2:自定义ParserInfo跟踪解析过程(精准匹配原始格式)
如果需要精准获取解析时识别的每个组件的格式,你可以自定义parserinfo类,重写解析各个日期组件的方法,跟踪识别到的格式片段,最后拼接成完整的格式字符串。示例代码如下:
from dateutil.parser import parserinfo, parse class TrackingParser(parserinfo): def __init__(self): super().__init__() self.format_fragments = [] # 重写解析年份的方法,记录年份格式 def parse_year(self, s, **kwargs): result = super().parse_year(s, **kwargs) if result: # 根据识别到的年份长度判断格式(4位年用%Y,2位用%y) self.format_fragments.append("%Y" if len(s.strip()) == 4 else "%y") return result # 重写解析月份的方法 def parse_month(self, s, **kwargs): result = super().parse_month(s, **kwargs) if result: # 数字月份用%m,英文缩写用%b,全称用%B s_stripped = s.strip() if s_stripped.isdigit(): self.format_fragments.append("%m" if len(s_stripped) == 2 else "%-m") else: self.format_fragments.append("%b" if len(s_stripped) <= 3 else "%B") return result # 重写解析日期的方法 def parse_day(self, s, **kwargs): result = super().parse_day(s, **kwargs) if result: self.format_fragments.append("%d" if len(s.strip()) == 2 else "%-d") return result # 重写解析小时的方法 def parse_hour(self, s, **kwargs): result = super().parse_hour(s, **kwargs) if result: self.format_fragments.append("%H") return result # 重写解析分钟的方法 def parse_minute(self, s, **kwargs): result = super().parse_minute(s, **kwargs) if result: self.format_fragments.append("%M") return result # 使用自定义解析器 date_str = "2024/05/20 14:30" tracker = TrackingParser() parsed_dt = parse(date_str, parserinfo=tracker) # 根据输入的分隔符拼接格式字符串(这里假设分隔符是/、空格、:) final_format = "/".join(tracker.format_fragments[:3]) + " " + ":".join(tracker.format_fragments[3:]) print(final_format) # 输出:%Y/%m/%d %H:%M
这个方法需要根据你的实际输入场景调整逻辑(比如处理不同的分隔符、秒数、AM/PM等),但能精准跟踪解析过程中识别的每个组件的格式。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

