2015-07-10 84 views
0

我有一個帶有10,000個日期字符串的csv文件,它看起來像2000/2000_03.mdf,我只需要每個字符串的年份和月份。我試過使用:將日期字符串(YYYY/YYYY_mm.mdf)轉換爲可用日期Python

datetime.strptime('2000/2000_03.mdf', '%Y/%Y_%m') 

但這會返回一個錯誤。我猜這與mdf到底是什麼有關,而且是重複的一年,但我不確定如何消除字符串的這些部分以獲得我想要的時間。有沒有簡單的方法來提取月份和年份?

+2

所以就把'.mdf'到您的格式字符串...這就是爲什麼有''%在那裏 - 爲格式字符Y'之間的區別'和'Y'作爲字符串中的常規字符。 –

回答

1

您可以直接切片字符串:

datetime.strptime('2000/2000_03.mdf'[5:-4], '%Y_%m') 

我們得到以下:

datetime.datetime(2000, 3, 1, 0, 0) 
5

如果您絕對相信,今年將永遠是正確的重複,我只。 ...跳過一年。

s = '2000/2000_03.mdf'.split('/') 
d = datetime.strptime(s[1], '%Y_%m.mdf') 
if int(s[0]) != d.year: 
    #uh, that file is confused. Do something? 
1

這有兩個問題。第一個是末尾的.mdf,正如@ marc-b指出的那樣,可以通過將其添加到您的格式字符串來解決。

但是,如果你只是這樣做,你會發現,你仍然可以得到一個ValueError

error: redefinition of group name 'Y' as group 2; was group 1 

你不能兩次strptime匹配同一組。如果你的數據在你提出的格式一致,那麼你可以使用string.split提取第二部分,並從閱讀:

basename = '2000/2000_03.mdf'.split('/')[1] 
datetime.strptime(basename, '%Y_%m.mdf') 
1

一個簡單的正則表達式工作在這種情況下,它應該比strptime()更輕鬆更高效比.split()爲基礎的解決方案爲:

import re 
from datetime import date 

def parse_date(path): 
    """Return date stored in the *path* or None on any error.""" 
    try: 
     year1, year2, month = map(int, re.findall(r'\d+', path)) 
     if year1 == year2: 
      return date(year2, month, 1) 
    except ValueError: 
     pass