我几乎完成了日期修复功能(我在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")
...
答案 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)