2011-02-18 33 views
17

我主要是正確的日期時間的數據庫,不過也有一些破產了,像這樣:Sat Dec 22 12:34:08 PST 20102015如何從一個Python的datetime對象中刪除未轉換的數據

沒有無效的年份,這是爲我工作:

end_date = soup('tr')[4].contents[1].renderContents() 
end_date = time.strptime(end_date,"%a %b %d %H:%M:%S %Z %Y") 
end_date = datetime.fromtimestamp(time.mktime(end_date)) 

但是,一旦我遇到一個無效年份的對象,我得到ValueError: unconverted data remains: 2,這是偉大的,但我不知道如何最好地去除一年中的壞字符。他們的範圍從2到6 unconverted characters

任何指針?我只想分割end_date,但我希望有一個日期時間安全的策略。

回答

13

是啊,我剛剛砍掉多餘的數字。假設他們總是附加到datestring,那麼像這樣的工作:

end_date = end_date.split(" ") 
end_date[-1] = end_date[-1][:4] 
end_date = " ".join(end_date) 

我要想方設法把從異常多餘的位數,但在我安裝了Python的版本(2.6.6和3.1.2)信息實際上並不存在;它只是說數據與格式不匹配。當然,您可以繼續每次刪除一個數字,然後重新解析,直到您沒有發生異常。

你也可以編寫一個只匹配有效日期的正則表達式,包括當年的正確數字,但看起來像是過度殺傷。

+3

+1,切掉多餘的是最好的辦法。這是一個相當簡單的單線程來做同樣的事情:`end_date = end_date [:end_date.rindex(「」)+5]` – 2011-02-18 19:02:43

12

除非你想重寫strptime(一個非常糟糕的主意),你的唯一真正的選擇是切片end_date和砍掉多餘的字符在最後,假設這會給你你打算正確的結果。

例如,你可以趕上ValueError,切片,然後再試一次:

def parse_prefix(line, fmt): 
    try: 
     t = time.strptime(line, fmt) 
    except ValueError as v: 
     if len(v.args) > 0 and v.args[0].startswith('unconverted data remains: '): 
      line = line[:-(len(v.args[0]) - 26)] 
      t = time.strptime(line, fmt) 
     else: 
      raise 
    return t 

例如:

parse_prefix(
    '2015-10-15 11:33:20.738 45162 INFO core.api.wsgi yadda yadda.', 
    '%Y-%m-%d %H:%M:%S' 
) # -> time.struct_time(tm_year=2015, tm_mon=10, tm_mday=15, tm_hour=11, tm_min=33, ... 
+0

尼斯精確去除被留下沒有太多的假設。 – 2011-02-18 19:09:12

+0

也可以按照要求使用`datetime.datetime.strptime`替換日期時間對象的`time.strptime`。 – 2016-11-16 23:49:47

0

strptime()確實希望看到格式正確的日期,因此您可能需要在調用end_date字符串之前對其進行一些調整。

這是砍在end_date 4字符的最後一個項目的一種方法:

chop = len(end_date.split()[-1]) - 4 
end_date = end_date[:-chop] 
2

提高(我希望)亞當羅森菲爾德的代碼:

import time 

for end_date in ('Fri Feb 18 20:41:47 Paris, Madrid 2011', 
        'Fri Feb 18 20:41:47 Paris, Madrid 20112015'): 

    print end_date 

    fmt = "%a %b %d %H:%M:%S %Z %Y" 
    try: 
     end_date = time.strptime(end_date, fmt) 
    except ValueError, v: 
     ulr = len(v.args[0].partition('unconverted data remains: ')[2]) 
     if ulr: 
      end_date = time.strptime(end_date[:-ulr], fmt) 
     else: 
      raise v 

    print end_date,'\n' 
相關問題