在Python中将字符串转换为日期时间,最佳猜测字符串格式

104

从字符串中获取日期时间的函数datetime.strptime(date_string, format)需要将字符串格式作为第二个参数传入。是否有一种方法可以在不知道确切格式且让Python自动猜测的情况下,从字符串中构建日期时间?


2
可能是重复的问题:有没有Python库可以从自然语言中解析日期和时间? - Andrew Walker
5
区分 mm/dd/yyyy 和 dd/mm/yyyy 是一个有趣的问题,如果你搞错了会带来灾难性的后果。 - Mark Ransom
1
这取决于你说“没有确切格式”时要多么不精确。你能举出你想处理的输入类型的例子吗?或者,你可能对格式有部分信息(例如年份是2位还是4位,或者月份在日期之前还是之后)?没有至少一些基本信息,即使是一个人也无法满足你的要求。01/02/12是2012年2月1日、2012年1月2日、2001年2月12日、2001年12月2日还是其他什么? - Silas Ray
1
https://github.com/jeffreystarr/dateinfer - denfromufa
@denfromufa 在Python3中导入dateinfer时,我遇到了以下错误: from infer import infer ModuleNotFoundError: No module named 'infer' - TanviP
4个回答

164

很棒的建议。它可以从字符串中解析任何格式化的日期/时间。 - Usman Liaqat
2
我知道这很老旧,但它无法处理这种字符串日期类型"Thursday, 21 May 2020 07:05:00 GMT",因为日期是完整书写的。对此有什么建议吗? - Yoël Zerbib
适用于单个字符串的好方法,但不适用于数组。 - geotheory
1
@YoëlZerbib 我刚刚测试了你的字符串。看起来已经修复了。我使用的是Python 3.10.2版本。 - DollarAkshay
1
简直不敢相信这个存在,多年来日期时间对象给我带来了很多麻烦,唉。谢谢你。 - ajsp

31

如果只需要检查日期,则可以使用简单的函数轻松完成。

def get_date(s_date):
    date_patterns = ["%d-%m-%Y", "%Y-%m-%d"]

    for pattern in date_patterns:
        try:
            return datetime.datetime.strptime(s_date, pattern).date()
        except:
            pass

    print "Date is not in expected format: %s" %(s_date)
    sys.exit(0)

1
如果你的日期格式被覆盖,使用它比使用dateutil要快得多。 - rbennell
我认为这种列举的方法,在所有尝试的错误格式中都默默失败,可以最好地用于在通常(标准,预期)的日期格式转换已经失败后,处理错误处理程序中的边缘情况。 - undefined

9
您可以使用 datefinder,它将检测所有类型的自然日期格式。
import datefinder # Module used to find different style of date with time

string_value = " created 01/15/2005 by ACME inc.and associates.January 4th,2017 at 8pm"
matches = datefinder.find_dates(string_value)            
for match in matches:
    print("match found ",match)

输出

match found  2005-01-15 00:00:00
match found  2017-01-04 20:00:00

与dateutil不同,datefinder无法解析裸月份,例如“七月”(没有日期或年份)。这是一种相当严重的限制,看起来应该是一个微不足道的修复。 - Forest
无法在“02-08-2021 - 10_789_0107987_1_165”中找到日期。 - West
啊,真可惜,希望它能输出字符串格式以解析日期。 - undefined

9

在我还是个Perl爱好者之前,我一直是一个Python爱好者。我一直想要的一个东西是类似于Date::Manip的模块。该模块可以从一堆杂乱无章的数据中提取出良好的时间戳。我几乎怀疑其作者和魔鬼签订了合同。

我发现了一些Python尝试实现该功能的方法:

如果你找到了更好的,请务必告诉我。


1
感谢您的建议-不过请看我的回答,我认为我已经通过dateutil库找到了答案。 - Yarin
什么是一点点小吃? - undefined
@wordsforthewise 一口是半个字节,一点是少量零散的东西。 - undefined
太搞笑了,听起来像是《哈利·波特》里的某件事情。 - undefined

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