使用通配符或将字符串解析为日期日期util.pars

2024-04-20 01:35:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

code_36763.letters_81m_2013_001_0000.dat

只是不构成日期的数字会改变,所以在通配符中

^{pr2}$

我的第一个想法是datetime.datetime.strptime,但是我得到一个错误,说ValueError: time data does not match format,这意味着{}不理解通配符。然后我的第二个想法是使用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

这可能意味着其他的数字正在妨碍我们。在

有没有一种方法可以解决这个问题,而不需要手动切割其他数字?我这么问是因为我要写的代码应该足够通用,其他数字可以在字符串的不同位置。在


Tags: 字符串parserdatetimeparse错误notcode数字
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")

给出输出:

^{pr2}$

我会使用正则表达式:

>>> 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。在

使用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

相关问题 更多 >