Python:测试string是否等于datetime对象?

时间:2017-12-29 15:05:33

标签: python-3.x date datetime exception-handling

我几乎完成了日期修复功能(我在Python中的第一个真正的项目!)并且我通过stackoverflow得到了很多很棒的帮助 - 谢谢!

我现在的问题是测试一个不符合我在我的程序中陈述的条件的变量。这就是我要做的事情:

对于我的计划中的日期,我想检查这些日期可能输入的各种方式(例如,01/01 / 1999,01-01-1999,1999年1月1日,1999年1/1 / 1,3 -9-1999,"无"等)。我无法工作的是输入的值是a)不是整数(即1999),b)不是datetime.date格式,或c)不是字符串' None&#39 ;。在我下面的完整代码示例中,我无法弄清楚如何获得" WORDS"点击一个例外,说明它不是一个有效的日期。

如果有人有时间,请您查看我的代码,看看您是否发现了明显的错误?我认为我可能需要一些比较变量' date'判断它是否是一个日期时间对象,如果为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")

修改

我通过稍微改变代码并制作一个&#34; else&#34;来完成工作。最后一个try / except块之前的块中的语句。通过寻找明星的踪迹更容易看到我的编辑:)

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

1 个答案:

答案 0 :(得分:1)

我发现了一些更好的东西。不要自己尝试所有格式,而是使用dateutil。尝试解析日期的一行代码。

您需要dateutil pip包

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)