python - 日期验证然后是 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
。关于如何做到这一点的任何想法?
解决方案
他们的关键是捕获和处理为无效日期字符串引发的异常。为了使您的示例工作:
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]
推荐阅读
- amazon-web-services - 从 WAF/Kinesis 获取时间戳到 Elasticsearch
- excel - 需要在散点图Excel中添加虚线
- android - 错误:找不到符号类生成器(使用 GeoApiContext)
- google-api - 尝试使用 Google Vault API 列出事项时出错
- excel - 从具有多个地址的变量中选择一个范围
- reactjs - Axios GET 请求表单编码数据
- javascript - 如何使用lodash按键连接两个不同大小的对象数组
- python - 增加 Tornado/Flask 设置的超时时间
- azure - 验证后谷歌不重定向
- wordpress - Wordpress 自行删除页面