是否有一个Python等效于C#的DateTime.TryParse()?

Meh*_*dad 23 python datetime parsing exception tryparse

DateTime.TryParse()在Python中是否有与C#相同的东西?

我指的是它避免抛出异常这一事实,而不是它猜测格式的事实.

Sin*_*ion 22

如果您不想要异常,请捕获异常.

try:
    d = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
except ValueError:
    d = None
Run Code Online (Sandbox Code Playgroud)

在Python的禅中,显式优于隐式.strptime 始终返回以指定的确切格式解析的日期时间.这是有道理的,因为你必须在失败的情况下定义行为,也许你真正想要的是.

except ValueError:
    d = datetime.datetime.now()
Run Code Online (Sandbox Code Playgroud)

要么

except ValueError:
    d = datetime.datetime.fromtimestamp(0)
Run Code Online (Sandbox Code Playgroud)

要么

except ValueError:
    raise WebFramework.ServerError(404, "Invalid date")
Run Code Online (Sandbox Code Playgroud)

通过明确表示,下一个人会清楚地知道故障转移行为是什么,并且它是您需要的.


或者也许你确信日期不会无效; 它来自数据库DATETIME,列,在这种情况下,不会有捕获的异常,因此不要捕获它.

  • "如果你不想要例外,请抓住异常." 你真的只是告诉我使用流量控制的例外吗?x____x (4认同)
  • 我告诉过你要使用异常处理*异常处理*,如果不是特殊情况,那么什么是格式错误的日期? (2认同)

smc*_*mci 10

我们想要try...catch多个日期时间格式fmt1,fmt2,...,fmtn并抑制/处理strptime所有不匹配的异常(from )(特别是,避免需要yukky n-deep缩进的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
Run Code Online (Sandbox Code Playgroud)

现在您可以调用,try_strptime(s, fmt1) or try_strptime(s, fmt2) or try_strptime(s, fmt3) ...但我们可以将其改进为:

2)应用多种可能的格式(作为参数传入或使用合理的默认值),迭代这些格式,捕获并处理内部的任何错误:

更清洁,更简单和更友好的OO是将这一点概括为使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
Run Code Online (Sandbox Code Playgroud)

(作为侧边栏,请注意,这...finally不是我们想要的机器人,因为它会在每次循环传递后执行,即在每个候选格式上执行,而不是在循环结束时执行.)

我发现实施2)更清洁,更好.特别地,该函数/方法可以存储默认格式的列表,这使得它更加安全,并且对现实世界数据的启发更少.(我们甚至可以根据其他列推断应用哪些默认格式,例如首先尝试德语数据的德语日期格式,阿拉伯语的阿拉伯语,博客数据的weblog日期时间格式等)


Eli*_*ens 5

不,您要求的不是惯用的 Python,因此通常不会有像标准库中那样丢弃错误的函数。相关的标准库模块记录在此处:

http://docs.python.org/library/datetime.html

http://docs.python.org/library/time.html

解析函数都会在无效输入上引发异常。

但是,正如其他答案所述,为您的应用程序构建一个并不是非常困难(您的问题被表述为“在 Python 中”而不是“在 Python 标准库中”,因此不清楚是否协助编写这样的函数“在 Python 中”是否回答了这个问题)。

  • @qneill你的意思是在一行中捕获多个异常并以相同的方式处理它们?`除了 ValueError、KeyboardError:` (py3); `除了(值错误,键盘错误):`(py2) (2认同)

Or *_*eis 5

这是等效的功能实现

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
Run Code Online (Sandbox Code Playgroud)


jnc*_*ton -2

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
Run Code Online (Sandbox Code Playgroud)

这是一种Python式的方式来做你想做的事。