2017-04-15 90 views
-2

解釋我的整個困境,我使用的是python 2.7。在Python中將寫入日期轉換爲日期格式

我有一個adbode pdf格式的文檔,有一個日期字段,我使用pdfminer函數提取值。我需要解決的問題是,Adobe Reader的用戶可以輸入諸如「2017年4月3日」或「2017年4月3日」或「2017年4月3日」或「04/04/2017」以及「 4 3 2017「。現在adobe中的日期字段被設置爲mm/dd/yyyy格式,所以當用戶鍵入上述值之一時,這是pdfminer拉動的實際值,但adobe會將其顯示爲04/03/2017,但當你點擊這個字段就會顯示出上面的實際值。土坯是允許這個,然後做它的轉換我認爲顯示日期爲mm/dd/yyyy。有能力使用JavaScript與Adobe進行更多的控制,但我不能這樣做,用戶只能使用沒有任何附帶的JavaScript文件的PDF格式。

所以我期待找到一個在python中可以接受日期時間的方法,例如上面例子中的字符串,然後將它們轉換爲真正的mm/dd/yyyy格式?我看到了轉換長和短月份名稱的方法,但是沒有處理像第一,第二,第三和第四這樣的日期名稱的方法。

回答

1

您可以依次嘗試每種可能的格式。首先刪除任何stndrd符,使測試更容易:

from datetime import datetime 

formats = ["%B %d %Y", "%d %B %Y", "%b %d %Y", "%m/%d/%Y", "%m %d %Y"] 
dates = ["april 3rd 2017", "3rd April 2017", "Apr 3rd 2017", "04/04/2017", "4 3 2017"] 

for date in dates: 
    date = date.lower().replace("rd", "").replace("nd", "").replace("st", "") 

    for format in formats: 
     try: 
      print datetime.strptime(date, format).strftime("%m/%d/%Y") 
     except ValueError: 
      pass 

這將顯示:

04/03/2017 
04/03/2017 
04/03/2017 
04/04/2017 
04/03/2017 

這種方法驗證每個日期的利益。例如,大於12的月份。您可以標記失敗所有允許格式的日期。

+0

哇謝謝,是的,我是看着做正則表達式,欣賞它。不知道是否有其他功能,我是新來的phython,所以爲什麼我問,但我可以用正則表達式:)冷靜。 –

+0

只是把你的代碼放在一邊,測試我總是得到「模塊對象沒有屬性'strptime'。但我導入日期時間庫?所以不知道爲什麼我檢查了它應該工作的python文檔。 –

+1

nm :)需要做「從datetime導入日期時間」;) –

1

只需編寫一個正則表達式來獲取字符串中的數字。

import re 

s = '30Apr' 
n = s[:re.match(r'[0-9]+', s).span()[1]] 
print(n) # Will print 30 

其他的事情應該很容易。

0

基於@ MartinEvans的anwser,但使用arrow庫:(因爲它的處理方式與日期時間多的情況下,這樣你就不必使用replace()也不lower()

首先安裝箭頭:

pip install arrow 

然後嘗試每一種可能的格式:

import arrow 

dates = ['april 3rd 2017', '3rd April 2017', 'Apr 3rd 2017', '04/04/2017', '4 3 2017'] 
formats = ['MMMM Do YYYY', 'Do MMMM YYYY', 'MMM Do YYYY', 'MM/DD/YYYY', 'M D YYYY'] 

def convert_datetime(date): 
    for format in formats: 
     try: 
      print arrow.get(date, format).format('MM/DD/YYYY') 
     except arrow.parser.ParserError: 
      pass 

[convert_datetime(date) for date in dates] 

將輸出:

04/03/2017 
04/03/2017 
04/03/2017 
04/04/2017 
04/03/2017 

如果您不確定的可能是錯誤在你的日期格式,你也可以輸出,如果沒有日期的格式相匹配的不錯的錯誤信息:

def convert_datetime(date): 
    for format in formats: 
     try: 
      print arrow.get(date, format).format('MM/DD/YYYY') 
      break 
     except (arrow.parser.ParserError, ValueError) as e: 
      pass 
    else: 
     print 'For date: "{0}", {1}'.format(date, e) 

convert_datetime('124 5 2017') # test invalid date 

將輸出以下錯誤消息:

'For date: "124 5 2017", month must be in 1..12' 
+0

我不明白爲什麼大多數人都害怕使用箭頭庫^^'無論如何我試過... hopefuly它可以是任何幫助其他用戶的社區! –