2017-12-29 31 views
1

나는 date-fixing 함수 (파이썬에서의 첫 번째 실제 프로젝트!)로 거의 끝났으며 stackoverflow를 통해 많은 도움을 얻었습니다 - 감사합니다!Python : 문자열이 datetime 객체와 같은지 테스트하십시오.

이제 내 문제는 내 프로그램에 명시된 조건을 준수하지 않는 변수를 테스트하는 것입니다. 여기에 내가하려고하는 것이있다 :

내 프로그램의 날짜에 대해, 나는이 날짜가 입력되었을 수도있는 다양한 방법을 확인하고 싶다. (예 : 01/01/1999, 01-01-1999, 01-Jan -1999, 1/1/1999, 3-9-1999, '없음'등). 내가 일할 수없는 것은 a) 정수 (예 : 1999)가 아닌 b) datetime.date 형식이 아닌 값 또는 c) 'None'문자열이 아닌 값을 입력 한 경우입니다. 아래의 전체 코드 예제에서 "WORDS"가 유효한 날짜가 아님을 알리는 예외를 발생시키는 방법을 알아낼 수 없습니다.

누군가 시간이 있다면 내 코드를보고 명백한 오류가 있는지 확인해 주시겠습니까? 나는 datetime 객체인지 아닌지를 변수 'date'와 비교하는 무언가가 필요할지도 모른다고 생각하고있다. 거짓이면 유효한 날짜가 아님을 나타내는 메시지를 출력하지만 이것을 잡으려고하는 시도는 모두 끝났다. 실패. 누구나 제안이나 다른 기사를 읽거나 비슷한 질문을 찾을 수 있다면 (알려지지 않았다면) 알려주십시오. 시간 내 주셔서 감사합니다!

* 코딩이 너무 길면 나도 용서해주십시오. 첫 번째 타이머!

import datetime 
import sys 
import re 

debug = True 
log = sys.stdout 

dates = ["WORDS", "4-1-2010", "9/1/1999", "7-9-2000", "01/01/2001", "None", "14-Jun-1905", \ 
"09/09/2009", 2008, "06-06-2006", 1999, "05-May-2005", "12/31/2010", "09-Jul-1905", "07/09/1905", \ 
"07-09-1905", "1-Jul-1905", "03-Aug-1935", "3/1/1965", 1900] 

def fix_date(date): 
    constant = datetime.date(1899, 12, 30) 
    if debug : print("Fix date:", date, file=log) 
    dt = datetime.datetime.strptime(date, '%d-%b-%Y') 
    year = int(dt.year) 
    month = int(dt.month) 
    day = int(dt.day) 
    cleanDate = datetime.date(year, month, day) 
    dateYear = cleanDate - constant 
    x = int(dateYear.days) 
    if x < 1901: 
     print("ERROR: Date removed:", date, '\n', file=log) 
     return "" 
    elif x <= datetime.datetime.now().year: 
     print("Date converted:", date, "\b:", dateYear.days, file=log) 
     print("Date OK:", dateYear.days, '\n') 
     return str(dateYear.days) 
    else: 
     newdate = datetime.datetime.strftime(cleanDate, '%Y%m%d') 
     if debug : print("Date OK:", newdate, '\n', file=log) 
     return newdate 
    print() 

print('\nAll Date Variables:\n') 
count = 0 

for date in dates: 
    count += 1 
    print(count, '\b: Original date:', date) 
    try: 
     if date != datetime.datetime.strptime(date, '%m-%d-%Y'): 
      dt = datetime.datetime.strptime(date, '%m-%d-%Y') 
      date = datetime.datetime.strptime(date, '%m-%d-%Y').strftime('%d-%b-%Y') 
      print("DASH:", date) 
      fix_date(date) 
    except: 
     try: 
      if date != datetime.datetime.strptime(date, '%m/%d/%Y'): 
       dt = datetime.datetime.strptime(date, '%m/%d/%Y') 
       date = datetime.datetime.strptime(date, '%m/%d/%Y').strftime('%d-%b-%Y') 
       print("SLASH:", date) 
       fix_date(date) 
     except: 
      try: 
       if date != datetime.datetime.strptime(date, '%d-%b-%Y'): 
        dt = datetime.datetime.strptime(date, '%d-%b-%Y') 
        date = datetime.datetime.strptime(date, '%d-%b-%Y').strftime('%d-%b-%Y') 
        print("MEDIUM:", date) 
        fix_date(date) 
      except: 
       try: 
        if date.strip() == "None": 
         print("NONE:", date) 
         print("DO NOT ENTER A DATE\n") 
       except: 
        try: 
         if len(str(date)) == 4: 
          print("INTEGER:", date) 
          print("Date OK:", str(date), '\n') 
        except: 
         print("SOME ERROR OCCURRED") 

편집 나는 except 블록/약간의 코드를 변경하고 마지막 시도하기 전에 블록에 "다른"문을 만들어 작업 할 일이있어. 별의 흔적을 찾아 내 편집을 더 쉽게 볼 수 있습니다.

... 
       try: 
        if date.strip() == "None": 
         print("NONE:", date) 
         print("DO NOT ENTER A DATE\n") 
        else: 
         print("********************INVALID DATE") 
... 

답변

1

나는 조금 더 나은 것을 발견했습니다. 모든 형식을 직접 시도하는 대신 dateutil을 사용하십시오. 한 줄의 코드로 날짜를 분석하고 분석합니다.

당신은

import dateutil 
from dateutil import parser 

dte = dateutil.parser.parse('03-31-1981'); 
dte = dateutil.parser.parse('03/31/1981'); 
dte = dateutil.parser.parse('1981-03-31'); 
dte = dateutil.parser.parse('1981-MAR-31'); 
print(dte) 
+0

당신을 감사합니다 dateutil 핍 패키지가 필요합니다! 나는 데이트툴을 살펴볼 것이다. 이는 또한 특정 형식이 아닌 변수 날짜를 식별하는 데 도움이 될 것인가 아니면 간단한 if/else 문으로 처리 할 수 ​​있습니까? 도움 주셔서 감사합니다. –

+0

이전의 제안에 따라 else 문을 사용하여 돌아 왔습니다. 마지막 try/if 문 다음에 넣으면 작동하는 것으로 보입니다. 이상한. 왜 그런가? 은' ... 을 code' 경우 date.strip() == "없음" 인쇄 ("NONE", 날짜) 인쇄는 ("A DATE \ 없음을 입력하지 마십시오") 다른 : 인쇄 ("INVALID DATE \ n") ... 'code' –

+0

간단히 dateutil을 사용하면 새로운 형식의 세계가 생길 수 있습니다. 이것으로 확실히 놀 것입니다. 고맙습니다! –

관련 문제