32

DateTime.TryParse()Python 中是否有与 C# 等价的东西?

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

4

8 回答 8

26

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

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

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

except ValueError:
    d = datetime.datetime.now()

或者

except ValueError:
    d = datetime.datetime.fromtimestamp(0)

或者

except ValueError:
    raise WebFramework.ServerError(404, "Invalid date")

通过明确说明,下一个阅读它的人会清楚故障转移行为是什么,并且这就是您需要的。


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

于 2011-07-07T22:21:04.827 回答
13

我们希望使用try...catch多种日期时间格式fmt1,fmt2,...,fmtn并抑制/处理strptime所有不匹配的异常(从 )(特别是,避免需要一个 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

现在您可以调用 astry_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

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

我发现实现 2) 更干净、更好。特别是函数/方法可以存储默认格式的列表,这使得它在现实世界的数据上更加安全,更少的异常快乐。(我们甚至可以根据其他列推断要应用哪些默认格式,例如,首先尝试在德语数据上使用德语日期格式,在阿拉伯语上尝试阿拉伯语,在博客数据上尝试使用博客日期时间格式等。)

于 2017-12-18T21:08:51.003 回答
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
于 2014-07-03T07:32:16.500 回答
5

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

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

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

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

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

于 2011-07-31T21:19:24.910 回答
3

蛮力也是一种选择:

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
于 2014-09-14T08:05:23.640 回答
0

用于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.
于 2011-07-07T18:49:52.140 回答
0

我同意 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
于 2020-04-20T02:37:20.167 回答
-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

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

于 2011-07-07T18:47:09.457 回答