2015-10-06 69 views
0

我有一系列字符串,我試圖解析爲日期。他們是形式(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 

這可能意味着,與其他數字的方式獲得。

有沒有辦法解決這個問題,而無需手動切割其他數字?我問這個,因爲我必須寫的代碼應該足夠普遍,其他數字可以在字符串的不同位置。

回答

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 
0

我會使用一個正則表達式:

>>> 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尋求該步驟的幫助。

0

字符串,因爲你有它看起來是相當固定的格式。如果是這樣的話,那麼下面的方法就足夠它只是切片關閉開始,使之爲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