【问题标题】:Cast strings to datetimes with regex使用正则表达式将字符串转换为日期时间
【发布时间】:2021-08-31 03:57:17
【问题描述】:

我希望将任何字符串转换为日期时间,遵循任何日期时间格式, 不尝试转换其他字符串,如常规文本。我现在在做什么:

from datetime import datetime
import re

pattern = r"\d{4}[-/]\d{2}[-/]\d{2}\s\d{2}:\d{2}:\d{2}"
regex = re.compile(pattern)


def cast_to_dt(TEXT):
    """Match datetimes, and convert them."""
    res = regex.match(TEXT)

    if res is None:
        return TEXT

    print(res.group(0))

    hash = {"-": "%Y-%m-%d %H:%M:%S", "/": "%Y/%m/%d %H:%M:%S"}

    dt_obj = ""

    if "-" in res.group(0):
        dt_obj = datetime.strptime(res.group(0), hash["-"])

    if "/" in res.group(0):
        dt_obj = datetime.strptime(res.group(0), hash["/"])

    print(dt_obj, type(dt_obj))


TEXT_10 = "2021-05-12 11:22:14"
TEXT_11 = "2021/05/12 11:22:14"
TEXT_20 = "I am definitely not a datetime"

cast_to_dt(TEXT_10)
cast_to_dt(TEXT_11)
cast_to_dt(TEXT_20)

我根据hash 字典设置格式的方法一旦开始增长就不会那么可读了。有没有更好的方法来自动检测或选择格式?

【问题讨论】:

  • 这就是你要找的东西吗? stackoverflow.com/questions/9507648/…
  • Nit-pick:您正在覆盖内置的 hash 函数 ;-) 还有关于 dateutil 的旁注;它非常方便,但要付出代价:性能。
  • @MrFuppes 谢谢。我不知道 Python 中有一个内置的 hash 函数。那么我应该选择一个不同的名称:) 性能也很好。这可能会成为一个问题。但是如果没有这个dateutil 库,我不确定如何通常捕获所有时间戳并进行转换。有什么想法吗?
  • 我想你必须为你的用例做出决定。您进行格式检查和验证的越具体,您就越能优化性能。对于您的示例,我认为通过 datetime.fromisoformat 编译的正则表达式 + 验证将是一个高性能匹配(甚至没有 re),但接受的格式非常有限。

标签: python python-3.x regex string datetime


【解决方案1】:

我认为您可以通过指定字符串格式来使用 strptime() 函数将字符串转换为日期时间。

from datetime import datetime

datetime_str = '2021-05-12 11:22:14'

datetime_object = datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S')
print(datetime_object)

【讨论】:

    【解决方案2】:

    在 @Valentin C 的 cmets 中建议的帖子 datetime from string in Python, best-guessing string format 之后,我从我正在寻找的字符串中获得了一般的日期时间转换。 在快速pip install python-dateutil 之后,我能够正确解析字符串:

    Python 3.8.5 (default, Sep  3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
    >>> import dateutil.parser
    >>> my_date = dateutil.parser.parse('2020-02-03 11:31:24')
    >>> my_date
    datetime.datetime(2020, 2, 3, 11, 31, 24)
    

    此外,dateutil.parser 在尝试根据需要解析非时间戳类字符串时会中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-16
      • 2012-01-28
      • 2022-11-18
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      相关资源
      最近更新 更多