首页 > 解决方案 > 日期验证然后是 Pytho 中有效日期的子集列表

问题描述

我有一个日期时间字符串列表,有些是有效的,有些则不是(即 2 月 30 日)。我想从我的列表中删除这些无效日期。示例代码:

dates = ["20200101 09:00:00", "20200230 09:15:00", "20200315 15:00:00", "20200732 14:00:00"]

我想让它只包含日期["20200101 09:00:00", "20200315 "15:00:00"],因为其他元素是无效的日期。

我尝试了以下方法:

from datetime import datetime
for x in dates:
   print(datetime.strptime(x, "%Y%m%d %H:%M:%S"))

在第二次迭代中,它给了我一个

ValueError : day is out of range for month

这个想法是为子集生成一个布尔系列dates。关于如何做到这一点的任何想法?

标签: pythonloopsdatetimebooleansubset

解决方案


他们的关键是捕获和处理为无效日期字符串引发的异常。为了使您的示例工作:

from datetime import datetime
dates = ["20200101 09:00:00", "20200230 09:15:00", "20200315 15:00:00", "20200732 14:00:00"]

for x in dates:
  try:
    print(datetime.strptime(x, "%Y%m%d %H:%M:%S"))
  except ValueError:
    pass

为了让它更有用一点,你可以将异常处理包装在一个验证器函数中:

def date_str_is_valid(date_str):
  try:
    datetime.strptime(date_str, "%Y%m%d %H:%M:%S")
    return True
  except ValueError:
    return False

for x in dates:
  if date_str_is_valid(date_str):
    print(datetime.strptime(x, "%Y%m%d %H:%M:%S"))

请注意,对于上面的示例,您现在为每个字符串调用 strptime 两次,因此它不是最有效的(您可以修改验证器以返回 srptime 的值或无)

但是,既然您有一个验证器函数,您可以使用它来过滤列表:

# Using filter:
>>> list(filter(date_str_is_valid, dates))
['20200101 09:00:00', '20200315 15:00:00']

# Using list comprehension
>>> [d for d in dates if date_str_is_valid(d)]
['20200101 09:00:00', '20200315 15:00:00']

这个想法是生成一个布尔系列来子集日期。

我不太清楚你的意思是什么。如果您在寻找指示每个列表元素是否有效的 True/False 值列表:

# Using list comprehension
>>> [date_str_is_valid(x) for x in dates]
[True, False, True, False]

# Using map
>>> list(map(date_str_is_valid, dates))
[True, False, True, False]

推荐阅读