Python dateutil日期转换

6

我想确认一组日期是否为有效日期。我正在使用dateutil库,但是结果很奇怪。例如,当我尝试以下操作时:

import dateutil.parser as parser
x = '10/84'
date = (parser.parse(x))
print(date.isoformat())

我得到了错误的结果1984-10-12T00:00:00,有人知道为什么这个12被加到日期里了吗?


你能提供一个更详细的代码示例吗? - farzad
更新为我正在尝试的实际代码。 - ray smith
2个回答

7
parse() 方法解析字符串并更新默认的 datetime 对象,使用解析得来的信息。如果没有传递 default 到这个函数中,它会使用今天的第一秒作为默认值。
这意味着你结果中的12是今天(运行代码时的日期),只有年和月从解析字符串中被更新。
如果你需要解析日期字符串但不确定它是否是有效的日期值,则可以使用 try ... except 块来捕获解析错误。
import dateutil.parser as parser
x = '10/84'
try:
    date = (parser.parse(x))
    print(date.isoformat())
except ValueError as err:
    pass # handle the error

我该如何避免出现错误,提示这不是一个日期? - ray smith
您在运行此代码示例时是否遇到错误?如果是,请提供更多关于错误的信息。 - farzad
不,我没有收到错误信息。它的行为就像你所说的那样。如果x = '10/84',我想要抛出一个错误。 - ray smith
如果您想确保在解析无效日期字符串时拥有控制权(例如该值由用户输入等提供),则可以使用 parse() 函数所记录的方法,抛出一个 ValueError 异常。因此,您可以将代码放入 try ... except 块中以捕获错误。 - farzad
如果用户输入x = '10/84',则不会抛出错误,因为对解析器来说这是一个有效的日期(基于我没有传递默认的datetime对象的事实)。但我不希望如此。如果用户以'month/year'格式输入日期,我希望抛出错误。 - ray smith

1

12是当前日期。 dateutil从当前日期/时间中获取组件,以解决日期或年份缺失的问题(对于月份不执行此操作,仅适用于日期或年份)。另一个示例是像January 20这样的日期-它将被解析为2015/01/12,其中2015年来自当前日期时间。

遗憾的是我还没有找到任何选项或类似的东西来停止这种行为。

我认为你最好的选择是列出您期望的有效日期时间格式列表,然后手动在它们上使用datetime.datetime.strptime,除了ValueError之外的所有错误。例如-

def isdate(dt, fmt):
    try:
        datetime.datetime.strptime(dt, fmt)
        return True
    except ValueError:
        return False

validformats = [...]
dates =[...]

for x in dates:
    if any(isdate(x,fmt) for fmt in validformats):
        print(x, 'is valid date')

这就是我所做的替代方法。我希望有一种绕过这个问题的方法。谢谢。 - ray smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接