2017-12-29 63 views
1

私は、日付固定機能(私の最初の実際のプロジェクト、Pythonでやった!)で終わりました。そして、私はstackoverflowを通して多くの大きな助けを得ました - ありがとう!Python:stringがdatetimeオブジェクトと等しいかどうかをテストしますか?

私の問題は、私のプログラムで述べた条件に合致しない変数のテストです。

私のプログラムの日付については、これらの日付が入力されている可能性があるかどうかをチェックしたいと思います(たとえば、01/01/1999、01-01-1999、01-Jan -1999、1/1/1999、3-9-1999、「None」など)。私が働くことができないのは、a)整数(すなわち1999年)でない値、b)datetime.date形式でない値、またはc)文字列 'None'でない値が入力された場合です。下の完全なコードの私の例では、 "WORDS"が有効な日付ではないという何かを言う例外を打つ方法を理解できません。

誰かが時間を持っていれば、私のコードを見て、明白なエラーを見つけてください。私は変数dateと変数datetimeを比較する必要があるかもしれないと思っています。もしfalseの場合、有効な日付ではないことを示すメッセージを表示しますが、失敗しました。誰かが提案や別の記事を読んだり、類似した質問が見つかった場合は、私に知らせてください。あなたの時間をありがとう!

*コーディングがあまりにも冗長すぎる場合は、私を許してください。最初のタイマー!

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") 

EDIT

私は少しのコードを変更し、ブロックを除く最後のtry /前のブロックで「他」の文を作ることによって動作するように物事を得ました。星の軌跡を探して私の編集を見るのが簡単です:)

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

答えて

1

私は少し良いものを見つけました。すべてのフォーマットを自分で試すのではなく、dateutilを使用してください。日付を解析して解析する1行のコード。

あなたは

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 PIPパッケージが必要になります!私はdateutilを見ます。特定の形式でない可変日付を識別するのにも役立ちますか、単純なif/elseステートメントで今すぐ処理されるでしょうか? ご協力いただきありがとうございます。 –

+0

あなたの以前の提案では、elseステートメントで、私は戻ってきました。私はそれを最後のtry/ifステートメントに置くとうまくいくと思われます。どんな考え? 'code' ... date.strip()== "なし" の場合: プリント( "NONE:"、日付) プリント( "DATEの\ nを入力しないでください")他 : プリントが( "INVALID DATE \ n") ... 'code' –

+0

dateutilを簡単に使いこなすと、それがうまくいくかもしれない新しいフォーマットの世界があるかもしれません。間違いなくこれでプレイします。ありがとうございました! –

関連する問題