2017-06-01 20 views
0

我試圖轉換日期格式並使用Python 3.6在整個文檔中統一它們。
這裏是我的文檔中的日期的樣本:(也有其他格式的文檔很大。)使用Python3檢測日期格式並將它們轉換爲MM-DD-YYYY

9/21/1989 
19640430 
6/27/1980 
5/11/1987 
Mar 12 1951 
2 aug 2015 

我已經檢查了datetime lbrary。但無法理解如何自動檢測和更改日期的格式。以下是我已經檢查到現在:

>>> from datetime import datetime 
>>> oldformat = '20140716' 
>>> datetimeobject = datetime.strptime(oldformat,'%Y%m%d') 
>>> newformat = datetimeobject.strftime('%m-%d-%Y') 
>>> print (newformat) 
07-16-2014 

但我沒有得到我怎樣才能使程序自動檢測日期模式並將其轉換爲日期的一個單一的統一的模式爲mm/dd/yyyy
請,建議什麼我需要這樣做,以便使用Python 3.6來實現我的目標。

+0

你打算如何解釋像「2/4/1994」這樣的日期?那是2月4日還是4月2日? – Kevin

+0

我認爲你可以做的最好的檢查是否datetimeobject是日期實例isinstance(datetimeobject,datetime.date) – Eliethesaiyan

+0

是的。我正在嘗試以「MM/DD/yyyy」格式製作日期。是的,你提到的是正確的 –

回答

1

(也有其他格式的文檔很大。)

不幸的是,Python不提供「猜我是什麼意思」的功能(儘管你也許能夠重新調整GNU date的是,因爲它是quite flexible)。您必須列出您想要支持的所有格式的列表,然後依次嘗試每個格式(使用您所示的datetime.strptime()),直到其中一個格式起作用。

Python不會嘗試猜測,因爲在國際範圍內,通常不可能推測用戶想要的內容。在美國,2/3/1994表示「1994年2月3日」,但在歐洲,相同的字符串表示「1994年3月2日」。 Python故意避免這種混淆。

+0

感謝凱文您的答案。但我想我找到了一個。讓我檢查一下,如果有效的話我會回答這個問題。 –

3

有這樣做的沒有Python通用的方式,但我建議你使用正則表達式來標識類型,然後正確地將其轉換:

例的Python

import re 
from datetime import datetime 

with open("in.txt","r") as fi, open("out.txt","w") as fo: 
    for line in fi: 
     line = line.strip() 
     dateObj = None 
     if re.match(r"^\d{8}$", line): 
      dateObj = datetime.strptime(line,'%Y%m%d') 
     elif re.match(r"^\d{1,2}/", line): 
      dateObj = datetime.strptime(line,'%m/%d/%Y') 
     elif re.match(r"^[a-z]{3}", line, re.IGNORECASE): 
      dateObj = datetime.strptime(line,'%b %d %Y') 
     elif re.match(r"^\d{1,2} [a-z]{3}", line, re.IGNORECASE): 
      dateObj = datetime.strptime(line,'%d %b %Y') 
     fo.write(dateObj.strftime('%m-%d-%Y') + "\n") 

例輸入

9/21/1989 
19640430 
6/27/1980 
5/11/1987 
Mar 12 1951 
2 aug 2015 

輸出示例

09-21-1989 
04-30-1964 
06-27-1980 
05-11-1987 
03-12-1951 
08-02-2015 
+0

嘿,這也不錯。謝謝您的回答。 –

2

我已經嘗試在我的代碼中使用dateutil庫來檢測任何格式的日期字符串。然後使用datetime庫將其轉換爲適當的格式。

下面是代碼:

>>> import dateutil.parser 
>>> yourdate = dateutil.parser.parse("May 24 2016") 
>>> 
>>> print(yourdate) 
2016-05-24 00:00:00 
>>> from datetime import datetime 
>>> oldformat = yourdate 
>>> datetimeobject = datetime.strptime(oldformat,'%Y-%m-%d %H:%M:%S') 
>>> newformat = datetimeobject.strftime('%m-%d-%Y') 
>>> print (newformat) 
05-24-2016 

這工作。

相關問題