如何检测日期格式是否在列表中



我正在尝试检测列表中是否包含元素。例如:

l1 = [['2018-04-16', '2020-04-16', 'ANNOVAR_DATE'],['abcd', 'efgh', 'ANNOVAR_DATE']]

我有一个格式字符串:

format = "%Y-%m-d"

目标是发现l1的第一个子列表具有日期格式,但l1的第二个子列表没有。我厌倦了使用两个for循环,迭代列表中的eles和I,并将I与甲酸字符串进行比较。如果找到,则返回子列表(['2018-04-16','2020-04-16','ANNOVAR_DATE'](,否则跳过。

import datetime
format = "%Y-%m-d"
for ele in l1:
for i in ele:
#print(i)
if datetime.datetime.strptime(i, format):
#print("This is the correct date string format.")
#return sublist that contains date format

else:
#print("This is the incorrect date string format. ")

但是,它总是报告错误:ValueError:时间数据"2018-04-16"与格式"%Y-%m-d"不匹配

有什么想法吗?如果你觉得你需要更多的澄清,请评论!感谢

如果您

  • 修复CCD_ 1变量中的拼写错误
  • 并使用try/except重写代码

如下:

import datetime
_format = "%Y-%m-%d"
l1 = [
['2018-04-16', '2020-04-16', 'ANNOVAR_DATE'],
['abcd', 'efgh', 'ANNOVAR_DATE']
]
for ele in l1:
for i in ele:
try: 
dt = datetime.datetime.strptime(i, _format)
print(f"{i} is the correct date string format.")
except ValueError:
print(f"{i} is the incorrect date string format.")

则结果如下:

2018-04-16 is the correct date string format.
2020-04-16 is the correct date string format.
ANNOVAR_DATE is the incorrect date string format. 
abcd is the incorrect date string format. 
efgh is the incorrect date string format. 
ANNOVAR_DATE is the incorrect date string format.

编辑:

对于您的特定检查目的,如果列表中有任何日期格式,您可以使用这样的计数器:

import datetime
_format = '%Y-%m-%d'
l1 = [
['2018-04-16', '2020-04-16', 'ANNOVAR_DATE'],
['abcd', 'efgh', 'ANNOVAR_DATE']
]
for ele in l1:
dt_counter = 0

for i in ele:
try: 
dt = datetime.datetime.strptime(i, _format)
dt_counter += 1

except ValueError:
pass


if dt_counter > 0:
print(f'There is datetime format in the following list: {ele}') 

结果如下:

There is datetime format in the following list: ['2018-04-16', '2020-04-16', 'ANNOVAR_DATE']

您需要做的是用try/except包装以下内容

datetime.datetime.strptime(i, format)

如果出现异常,您将知道字符串和格式之间不匹配

错误:ValueError: time data '2018-04-16' does not match format '%Y-%m-d'发生是因为您在d上忘记了%

format更改为format = "%Y-%m-%d"

正如其他人所说,格式值中有一个类型,但除了管理错误的格式日期外,您还需要尝试一下。此外,使用next()+filter()应该快速高效:

import datetime
l1 = [['asd'], ['2018-04-16', '2020-04-16', 'ANNOVAR_DATE'],['abcd', 'efgh', 'ANNOVAR_DATE']]
DATE_FORMAT = "%Y-%m-%d"
def has_date_format(sublist):
for value in sublist:
try:
datetime.datetime.strptime(value, DATE_FORMAT)        
return True
except: pass
return False
sublist = next(filter(has_date_format, l1))
if sublist:
print('Sublist with date format found: ', sublist)
else:
print('No sublist with date format found ')

最新更新