2017-04-15 4 views
-2

내 모든 딜레마를 설명하고 파이썬 2.7을 사용하고 있습니다.파이썬 날짜 형식으로 서면으로 변환

날짜 필드가있는 adbode pdf 양식 doc이 있는데, 나는 pdfminer 함수를 사용하여 값을 추출합니다. 내가 해결해야 할 문제는 어도비 아크obat 리더의 사용자는 "4 월 3 일 2017"또는 "3 월 4 일 2017"또는 "4 월 3 일 2017"또는 "04/04/2017"뿐만 아니라 " 4 3 2017 ". 이제 adobe의 날짜 필드는 mm/dd/yyyy 형식으로 설정되므로 사용자가 위의 값 중 하나를 입력하면 pdfminer가 가져 오는 실제 값이지만 adobe는이를 04/03/2017로 표시하지만 필드를 클릭하면 위와 같은 실제 값이 표시됩니다. 어도비는 이것을 허용하고 그때 나는 mm/dd/yyyy로 날짜를 표시하는 것으로 생각하는 변환을 수행합니다. 거기에 더 많은 제어 어도비와 javascript를 사용하는 능력이 있지만 사용자가 가질 수있는 모든 자바 스크립트 파일을 첨부하지 않고도 PDF 형식을 사용할 수 없습니다.

그래서 문자열에서 위의 예제와 같이 작성된 날짜를 받아 들일 수 있고 실제 mm/dd/yyyy 형식으로 변환 할 수있는 파이썬에서 datetime으로 메서드를 찾으려고 했습니까 ??? 길고 짧은 달 이름을 변환하는 방법을 보았지만 1 일, 2 일, 3 일, 4 일과 같은 요일 이름을 처리 할 방법은 없었습니다.

답변

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 개월 이상일 수 있습니다. 허용 된 모든 형식을 실패한 모든 날짜에 플래그를 지정할 수 있습니다. @ MartinEvans의 anwser하지만 arrow 라이브러리를 사용하여 바탕으로

+0

와우 감사합니다. 예, 저는 정규식을보고 있었는데, 고마워했습니다. 어떤 다른 함수가 있었는지 모르겠다. 파이썬에 익숙하지 않은 이유는 무엇인지 물어 보았다. 그러나 나는 정규식으로 갈 수있다. :) 멋지다. –

+0

그냥 코드를 넣고 테스트하면 "모듈 객체에는 strptime 속성이 없습니다"라는 메시지가 나타납니다.하지만 datetime lib를 가져 왔습니까? 그래서 내가 왜 파이썬 워드 프로세서를 확인했는지 확신 할 수 없다. –

+1

nm :) "datetime import datetime"에서 수행해야합니다. –

1

정규 표현식을 작성하여 문자열에서 숫자를 가져옵니다.

import re 

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

다른 것들은 쉬워야합니다.

0

:

먼저 설치합니다 (이 날짜보다 더 많은 경우를 처리하기 때문에 당신은 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

왜 대부분이 화살표 라이브러리를 사용하는 것을 두려워하는지 알지 못합니다 ^^ '어쨌든 시도했는데 ... 다른 사람들에게 도움이 될 수 있습니다. ! –

관련 문제