使用通配符或dateutil.parser将字符串解析为日期
问题描述:
我有一系列字符串,我试图解析为日期。他们是形式(001是儒略日)使用通配符或dateutil.parser将字符串解析为日期
code_36763.letters_81m_2013_001_0000.dat
只有不构成日期的变化,所以在通配符,这将是
code_?????.letters_??m_%Y_%j_%H%M.dat
我首先想到的NWAS的数字试试这是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
这可能意味着,与其他数字的方式获得。
有没有办法解决这个问题,而无需手动切割其他数字?我问这个,因为我必须写的代码应该足够普遍,其他数字可以在字符串的不同位置。
答
像这样的东西可以通过使用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
答
我会使用一个正则表达式:
>>> 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寻求该步骤的帮助。
答
字符串,因为你有它看起来是相当固定的格式。如果是这样的话,那么下面的方法就足够它只是切片关闭开始,使之为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