【问题标题】:datetime from string in Python, best-guessing string formatPython中字符串的日期时间,最佳猜测字符串格式
【发布时间】:2012-03-19 10:36:53
【问题描述】:

从字符串中获取日期时间的函数datetime.strptime(date_string, format) 需要字符串格式作为第二个参数。有没有办法在不知道确切格式的情况下从字符串构建日期时间,并且让 Python 最好地猜测它?

【问题讨论】:

  • 区分 mm/dd/yyyy 和 dd/mm/yyyy 是一个有趣的问题,如果弄错了,后果将不堪设想。
  • 当你说“没有确切的格式”时,这取决于你的意思是多么不准确。您能否举例说明您希望能够处理的输入类型?或者,您是否可能获得有关格式的部分信息(例如年份是 2 位还是 4 位,或者月份是否在日期之前,反之亦然)?没有至少一些基本信息,即使是一个人也无法做到你所要求的。是 2012 年 2 月 1 日 01/02/12、2012 年 1 月 2 日、2001 年 2 月 12 日、2001 年 12 月 2 日还是其他日期?
  • @denfromufa 在 Python3 上导入 dateinfer 时出现以下错误: from infer import infer ModuleNotFoundError: No module named 'infer'

标签: python datetime


【解决方案1】:

在我成为 python 人之前,我是一个 perl 人。我一直错过但没有看到任何接近它的东西之一是Date::Manip。该模块可以从少量半字节中提取一个好的时间戳。我几乎怀疑它的作者与魔鬼达成了交易。

我在 Python 中遇到过一些问题:

如果你发现更好的东西,我很乐意听到。

【讨论】:

  • 感谢您的建议 - 不过请查看我的答案,我想我在 dateutil 库中找到了自己的答案。
【解决方案2】:

使用dateutil 库。

我已经在使用 dateutil 作为处理时区不可或缺的库
(见Convert UTC datetime string to local datetimeHow do I convert local time to UTC in Python?

我刚刚意识到它支持日期解析:

import dateutil.parser
yourdate = dateutil.parser.parse(datestring)

(另见How do I translate a ISO 8601 datetime string into a Python datetime object?

【讨论】:

  • 很好的建议。它可以从字符串中解析任何格式化的日期/时间。
  • 我知道它已经过时了。但它不处理此字符串日期类型“星期四,2020 年 5 月 21 日 07:05:00 GMT”,因为这一天已写满。有什么建议吗?
【解决方案3】:

如果只检查日期,则可以使用简单的函数。

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)

【讨论】:

  • 只要你的日期格式被覆盖,比使用 dateutil 快得多。
【解决方案4】:

你可以使用 datefinder ,它会检测所有类型的自然风格的日期。

import datefinder # 模块用于查找不同风格的日期与时间

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 不能解析一个裸月,例如。 “七月”(没有一天或一年。)这是一个重大限制,似乎是一个微不足道的解决方案。
猜你喜欢
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多