Python: 测试字符串是否等于日期时间对象?
Python: Test if string is equal to a datetime object?
我几乎完成了日期修复功能(我在 Python 中的第一个真正的项目!)并且我通过 Whosebug 获得了很多帮助——谢谢!
我现在的问题是测试一个不符合我在程序中声明的条件的变量。这是我正在尝试做的事情:
对于我程序中的日期,我想检查可能输入这些日期的各种方式(例如,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' 和它是否是一个日期时间对象,如果为假,打印出一条消息,表明它不是一个有效的日期,但是多次尝试抓住这个都没有成功。如果有人有建议,或要阅读另一篇文章,或者如果他们能找到类似的问题(我还没有找到),请告诉我。感谢您的宝贵时间!
*另外,如果编码过于冗长,请见谅;第一个定时器!
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")
编辑
我通过稍微修改代码并在最后一个 try/except 块之前的块中制作一个 "else" 语句来让事情正常进行。通过寻找星星的踪迹更容易看到我的编辑:)
...
try:
if date.strip() == "None":
print("NONE:", date)
print("DO NOT ENTER A DATE\n")
else:
print("********************INVALID DATE")
...
我发现了一些更好的东西。与其自己尝试所有格式,不如使用 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)
我几乎完成了日期修复功能(我在 Python 中的第一个真正的项目!)并且我通过 Whosebug 获得了很多帮助——谢谢!
我现在的问题是测试一个不符合我在程序中声明的条件的变量。这是我正在尝试做的事情:
对于我程序中的日期,我想检查可能输入这些日期的各种方式(例如,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' 和它是否是一个日期时间对象,如果为假,打印出一条消息,表明它不是一个有效的日期,但是多次尝试抓住这个都没有成功。如果有人有建议,或要阅读另一篇文章,或者如果他们能找到类似的问题(我还没有找到),请告诉我。感谢您的宝贵时间!
*另外,如果编码过于冗长,请见谅;第一个定时器!
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")
编辑
我通过稍微修改代码并在最后一个 try/except 块之前的块中制作一个 "else" 语句来让事情正常进行。通过寻找星星的踪迹更容易看到我的编辑:)
...
try:
if date.strip() == "None":
print("NONE:", date)
print("DO NOT ENTER A DATE\n")
else:
print("********************INVALID DATE")
...
我发现了一些更好的东西。与其自己尝试所有格式,不如使用 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)