【问题标题】:Parse string into date with wildcards or dateutil.parser使用通配符或 dateutil.parser 将字符串解析为日期
【发布时间】:2019-07-10 14:46:27
【问题描述】:

我有一系列字符串,我试图将其解析为日期。它们的形式是(001 是儒略日)

code_36763.letters_81m_2013_001_0000.dat

只有不构成日期的数字会发生变化,所以在通配符中这将是

code_?????.letters_??m_%Y_%j_%H%M.dat

我首先想到的是datetime.datetime.strptime,但我收到一个错误提示ValueError: time data does not match format,这意味着strptime不理解通配符。然后我的第二个想法是使用dateutil.parser,但是当我这样做时

from dateutil.parser import parse
f='code_36763.letters_81m_2013_001_0000.dat'
parse(f, fuzzy=True)

我得到了错误

TypeError: 'NoneType' object is not iterable

这可能意味着其他数字正在阻碍。

有没有办法在不手动删除其他数字的情况下解决这个问题?我问这个是因为我必须编写的代码应该足够通用,以便其他数字可以位于字符串中的不同位置。

【问题讨论】:

    标签: python datetime parsing


    【解决方案1】:

    这样的事情可以通过使用re.sub 将文件名重新格式化为strptime 可以解析的名称来实现。

    >>> import re
    >>> import datetime
    >>> filenames = ["code_36763.letters_81m_2013_001_0000.dat", "code_36763.letters_81m_2013_240_1700.dat"]
    >>> for n in filenames:
    ...   parsed = re.sub(r"code_\d+.letters_\d{2}m_(\d{4})_(\d{3})_(\d{2})(\d{2}).dat", r"\1-\2-\4:\3", n)
    ...   print datetime.datetime.strptime(parsed, "%Y-%j-%H:%M")
    ...
    2013-01-01 00:00:00
    2013-08-28 00:17:00
    

    【讨论】:

      【解决方案2】:

      我会使用正则表达式:

      >>> import re
      >>> re.match(
              r"code_\d{5}.letters_\d{2}m_(?P<year>\d{4})_(?P<day>\d{3})_(?P<hour>\d{2})(?P<minute>\d{2}).dat", 
              "code_36763.letters_81m_2013_001_0000.dat"
          ).groupdict()
      {'year': '2013', 'day': '001', 'minute': '00', 'hour': '00'}
      

      然后您可以将数字转换为整数并相应地传递它们。参见例如Convert julian day into date 寻求帮助。

      【讨论】:

        【解决方案3】:

        您拥有的字符串似乎是相当固定的格式。如果是这种情况,那么以下方法可能就足够了,它只是简单地切掉开头,使其适合strptime

        import datetime
        
        filename = "code_36763.letters_81m_2013_001_0000.dat"
        print datetime.datetime.strptime(filename[-19:-4], "m_%Y_%j_%H%M")
        

        给你输出:

        2013-01-01 00:00:00
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-10
          • 2013-06-05
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          相关资源
          最近更新 更多