Python 将未知格式的日期字符串转换为日期时间

Python 将未知格式的日期字符串转换为日期时间,python,datetime,Python,Datetime,我正在构建一个通用的自定义strotdatetime(string)函数。日期字符串可能采用某些不同的格式。两个最流行的替代方案似乎是datetime.strptime(string,format)和dateutil.parser(string)。似乎datetime.strtime()需要格式,而dateutil.parser()不需要格式,因此可能的解决方案似乎是: 测试日期字符串模式以查找日期字符串格式并使用datetime.strtime() 使用dateutil.parser() 这是

我正在构建一个通用的自定义
strotdatetime(string)
函数。日期字符串可能采用某些不同的格式。两个最流行的替代方案似乎是
datetime.strptime(string,format)
dateutil.parser(string)
。似乎
datetime.strtime()
需要格式,而
dateutil.parser()
不需要格式,因此可能的解决方案似乎是:

  • 测试日期字符串模式以查找日期字符串格式并使用
    datetime.strtime()
  • 使用
    dateutil.parser()
  • 这是正确的吗?备选方案1(难度更大,将来可能需要维护)具有一些优势,例如性能?

    dateutil的
    parse()
    方法非常灵活,几乎可以解析任何您想要解析的内容

    然而,由于这种灵活性,如果您的输入仅限于一定数量的模式,那么检查这些模式的自定义代码就可以使用
    datetime.datetime.strtime()
    轻松击败它


    因为这完全取决于您需要测试的模式数量,所以您唯一能做的就是测量哪一种模式对于您的特定用例更快。

    我总是选择最简单的模式(dateutil.parser),有人总是为您做这项工作,并且不太可能在格式错误时抛出错误(根据您的格式)日期

    当然,有时您希望它在格式错误、可能不明确的日期抛出错误,在这种情况下,您应该使用
    strtime

    性能测试: 我每100000次调用
    parse(d)
    datetime.datetime.strtime(d,f)

    parse(d) took 5.62201309204 seconds
    datetime.datetime.strptime(d, f) took 1.78140687943 seconds
        (where d = '11-02-1980' and f = '%m-%d-%Y')
    
    如果你知道确切的日期格式,那么
    strtime
    的速度似乎要快3倍左右,虽然这不是一个非常科学的实验,但我认为它给出了一个很好的指示


    那么,这种轻微的速度提升值得额外的不必要的并发症/头痛吗?这取决于你(但可能不是)。

    我现在不担心性能。简单的指导原则:1.让它工作起来,2.让它清醒起来,3.让它快起来。或者:过早优化是万恶之源。我总是选择最简单的(
    dateutil.parser
    ),总是有人为您完成这项工作,而且在格式错误的日期(根据您的
    format
    )不太可能出现错误。性能差异可能很小(但唯一知道的方法是测试!)同意@hayden的观点。测试起来也容易得多。如果你试图对一组已知格式进行解析,直到成功为止,你就知道自己的确切位置,你正在使用经过验证的代码。在哪里测试,看看应该使用哪种解析器,会给你留下大量的测试用例。