【问题标题】:python datetime strptime wildcardpython datetime strptime 通配符
【发布时间】:2009-08-11 02:23:47
【问题描述】:

我想将这样的日期解析为日期时间对象:

  • 2008 年 12 月 12 日
  • 2009 年 1 月 1 日

以下内容适用于第一次约会:

datetime.strptime("December 12th, 2008", "%B %dth, %Y")

但由于日期编号 ('st') 的后缀,第二次会失败。那么,strptime 中是否存在未记录的通配符?还是更好的方法?

【问题讨论】:

    标签: python datetime parsing strptime


    【解决方案1】:

    尝试使用 dateutil.parser 模块。

    import dateutil.parser
    date1 = dateutil.parser.parse("December 12th, 2008")
    date2 = dateutil.parser.parse("January 1st, 2009")
    

    可在此处找到其他文档:http://labix.org/python-dateutil

    【讨论】:

    【解决方案2】:

    您需要 Gustavo Niemeyer 的 python_dateutil -- 安装后,

    >>> from dateutil import parser
    >>> parser.parse('December 12th, 2008')
    datetime.datetime(2008, 12, 12, 0, 0)
    >>> parser.parse('January 1st, 2009')
    datetime.datetime(2009, 1, 1, 0, 0)
    >>> 
    

    【讨论】:

      【解决方案3】:

      strptime 很棘手,因为它的实现依赖于底层 C 库,因此平台之间的一些细节有所不同。似乎没有办法匹配您需要的字符。但你可以先清理数据:

      # Remove ordinal suffixes from numbers.
      date_in = re.sub(r"(st|nd|rd|th),", ",", date_in)
      # Parse the pure date.
      date = datetime.strptime(date_in, "%B %d, %Y")
      

      【讨论】:

      • 我会担心到 8 月会发生什么。
      • 这就是为什么我在后面加上逗号。
      • 我会说你最好在正则表达式之前添加 [\d]{1,2}。毕竟你想匹配数字后的后缀,对吧? :-)
      • [\d]{1,2} 将匹配数字并将它们从日期中删除,不是很有帮助!您需要正面看待断言,以确保 st/nd/rd/th 前面有一个数字,但与该数字不匹配,如下所示: (?
      【解决方案4】:

      如果您想使用任意通配符,您可以使用datetime-glob,这是我们开发的一个模块,用于从由一致的日期/时间格式生成的文件列表中解析日期/时间。来自模块的文档:

      >>> import datetime_glob
      >>> matcher = datetime_glob.Matcher(
                               pattern='/some/path/*%Y-%m-%dT%H-%M-%SZ.jpg')
      
      >>> matcher.match(path='/some/path/some-text2016-07-03T21-22-23Z.jpg')
      datetime_glob.Match(year = 2016, month = 7, day = 3, 
                          hour = 21, minute = 22, second = 23, microsecond = None)
      
      >>> match.as_datetime()
      datetime.datetime(2016, 7, 3, 21, 22, 23)
      

      【讨论】:

      • 这正是我需要的:)
      【解决方案5】:

      对于像我这样只想要在没有额外模块的情况下“工作”的人来说,这是一个快速而肮脏的解决方案。

      string_list = ["th", "rd", "nd", "st"]
      time = None
      for str in string_list:
          if (time is not None):
              break
          try:
              match_string = '%B %d' + str +', %Y'
              time = datetime.strptime("December 12th, 2008", match_string)
          except Exception:
              pass
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2012-04-15
        • 2019-07-17
        • 1970-01-01
        • 2013-10-29
        相关资源
        最近更新 更多