Python中是否有与C#的DateTime.TryParse()
相等的功能?
我指的是它避免抛出异常的特性,而不是它猜测日期格式的特性。
如果你不想要异常,就捕获它。
try:
d = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
except ValueError:
d = None
在Python的“禅语”中,显式优于隐式。 strptime
始终会返回按照指定精确格式解析后的 datetime 对象。这是有道理的,因为在失败时必须定义行为,也许你真正想要的是。except ValueError:
d = datetime.datetime.now()
或者except ValueError:
d = datetime.datetime.fromtimestamp(0)
或者except ValueError:
raise WebFramework.ServerError(404, "Invalid date")
通过明确指定,下一个阅读该代码的人就能清楚了解故障转移行为,并且确认它符合你的需求。
或者你很确定日期不会无效;因为它是从数据库DATETIME列中获取的,那么就不需要捕获异常。
DateTime.TryParse()
,因为TryParse 不符合python的风格”。Python中的所有解析器在遇到无法解析的输入时都会引发ValueError
异常。 - SingleNegationElimination我们希望尝试使用多个日期时间格式 fmt1,fmt2,...,fmtn
并抑制/处理所有不匹配的异常(来自 strptime
),特别是避免需要丑陋的n重缩进阶梯 try..catch
子句。我找到了两种优雅的方法,第二种通常最好。(这是实际数据中的一个大问题,其中多个、不匹配、不完整、不一致、多语言/地区的日期格式经常混合在一个数据集中。)
1)逐个尝试应用每个格式,并将每个单独的 strptime()
失败处理为 None
的返回值,以便您可以链接fn调用......
首先,从@OrWeis的答案进行调整:
def try_strptime_single_format(s, fmt):
try:
return datetime.datetime.strptime(s, fmt)
except ValueError:
return None
现在您可以使用try_strptime(s, fmt1) or try_strptime(s, fmt2) or try_strptime(s, fmt3) ...
来调用。但我们可以将其改进为:
2)应用多个可能的格式(作为参数传递或使用合理的默认值),遍历这些格式,内部捕获和处理任何错误:
更加简洁、简单和面向对象的做法是将formats
参数通用化为单个字符串或列表,然后对其进行迭代... 这样,您的调用就可以简化为try_strptime(s, [fmt1, fmt2, fmt3, ...])
。
def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
for fmt in fmts:
try:
return datetime.strptime(s, fmt)
except:
continue
return None # or reraise the ValueError if no format matched, if you prefer
(顺便提一下,需要注意的是...finally
语句并不是我们想要的东西,因为它会在每次循环通过即每个候选格式上执行,而不是在循环结束时执行一次。)
我认为实现方式2)更加简洁和优秀。特别是该函数/方法可以存储默认格式列表,这使得它在真实世界的数据上更加安全和少出现异常(我们甚至可以根据其他列推断应用哪些默认格式,例如在德语数据上首先尝试德语日期格式,在阿拉伯语数据上尝试阿拉伯语日期格式,在网络日志数据上尝试日志日期时间格式等等)。
import datetime
def try_strptime(s, format):
"""
@param s the string to parse
@param format the format to attempt parsing of the given string
@return the parsed datetime or None on failure to parse
@see datetime.datetime.strptime
"""
try:
date = datetime.datetime.strptime(s, format)
except ValueError:
date = None
return date
try..except
阶梯,这实际上是最好的实现方式。您可能想指出其优雅之处:您可以将其链接为try_strptime(s, fmt1) or try_strptime(s, fmt2) or try_strptime(s, fmt3) ...
。您甚至可以将其泛化,使formats
参数成为单个字符串或列表,并对其进行迭代... try_strptime(s, [fmt1, fmt2, fmt3, ...])
。 - smciBaseException
),请使用 except Exception:
。 - Eli Stevensexcept ValueError, KeyboardError:
(py3); except (ValueError, KeyboardError):
(py2) - Natacha暴力破解也是一种选择:
def TryParse(datestring, offset):
nu = datetime.datetime.now()
retval = nu
formats = ["%d-%m-%Y","%Y-%m-%d","%d-%m-%y","%y-%m-%d"]
if datestring == None:
retval = datetime.datetime(nu.year,nu.month,nu.day,0,0,0) - datetime.timedelta(offset,0,0,0,0,0,0)
elif datestring == '':
retval = datetime.datetime(nu.year,nu.month,nu.day,0,0,0) - datetime.timedelta(offset,0,0,0,0,0,0)
else:
succes = False
for aformat in formats:
try:
retval = datetime.datetime.strptime(datestring,aformat)
succes = True
break
except:
pass
if not succes:
retval = datetime.datetime(nu.year,nu.month,nu.day,0,0,0) - datetime.timedelta(offset,0,0,0,0,0,0)
return retval
datetime.timedelta(offset,0,0,0,0,0,0)
到梯子底部。实际上,这更适合于一个帮助函数,return retval
只需要一行代码就能实现。 - smci使用time.strptime
从字符串中解析日期。
文档:http://docs.python.org/library/time.html#time.strptime
示例来自:http://pleac.sourceforge.net/pleac_python/datesandtimes.html
#-----------------------------
# Parsing Dates and Times from Strings
time.strptime("Tue Jun 16 20:18:03 1981")
# (1981, 6, 16, 20, 18, 3, 1, 167, -1)
time.strptime("16/6/1981", "%d/%m/%Y")
# (1981, 6, 16, 0, 0, 0, 1, 167, -1)
# strptime() can use any of the formatting codes from time.strftime()
# The easiest way to convert this to a datetime seems to be;
now = datetime.datetime(*time.strptime("16/6/1981", "%d/%m/%Y")[0:5])
# the '*' operator unpacks the tuple, producing the argument list.
TryParse
**而不是Parse
,是有原因的... - user541686我同意tryparse在C#中是非常有用的函数。不幸的是,在Python中没有直接等效的函数(也许是我不知道)。我相信你想检查一个字符串是否为日期,而不必担心日期格式。我的建议是使用 pandas
的 to_datetime
函数:
def is_valid_date(str_to_validate: str) -> bool:
try:
if pd.to_datetime(str_to_validate):
return True
else:
return False
except ValueError:
return False
strptime怎么样?
http://docs.python.org/library/time.html#time.strptime
如果无法根据提供的格式解析字符串,它将抛出 ValueError 异常。编辑:
由于问题在我回答后被编辑以包括关于异常的部分,我想添加一些注释。
正如其他答案所指出的那样,如果您不希望程序引发异常,您可以简单地捕获并处理它:
try:
date = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
except ValueError:
date = None
这是一种Pythonic的方式来实现你想要的。
TryParse
**而不是Parse
,是有原因的... - user541686
try_parse_*
方法。惯用语通常是“宁愿请求宽恕,也不要事先获得许可”,即只需执行并捕获异常(如果您可以处理它们)。 - user395760DateTime.TryParse
会猜测字符串的时间格式。这不是“三思而后行”的问题。 - Steven Rumbalski