【问题标题】:type object 'datetime.datetime' has no attribute 'fromisoformat'类型对象“datetime.datetime”没有属性“fromisoformat”
【发布时间】:2020-02-17 16:22:27
【问题描述】:

我有一个包含以下导入的脚本:

from datetime import datetime

和我调用的一段代码:

datetime.fromisoformat(duedate)

遗憾的是,当我使用 Python 3.6 实例运行脚本时,控制台返回以下错误:

AttributeError: type object 'datetime.datetime' 没有属性 'fromisoformat'

我尝试从 anaconda 的两个实例(3.7 和 3.8)运行它,它运行良好且流畅。 我想有一个导入问题,所以我尝试将 datetime.py 从 anaconda/Lib 复制到脚本目录,但没有成功。

datetime.py 显然包含类datetime 和方法fromisoformat,但它似乎仍然没有链接。我什至尝试显式链接datetime.py 文件,但出现同样的错误:

parent_dir = os.path.abspath(os.path.dirname(__file__))
vendor_dir = os.path.join(parent_dir, 'libs')
sys.path.append(vendor_dir+os.path.sep+"datetime.py")

你能帮帮我吗?我的想法结束了……

【问题讨论】:

    标签: python datetime python-import


    【解决方案1】:

    这里的问题实际上是 fromisoformat 在 Python 3.7 之前的版本中不可用,您可以在文档 here 中看到明确说明。

    Return a date corresponding to a date_string given in the format YYYY-MM-DD:
    >>>
    
    >>> from datetime import date
    >>> date.fromisoformat('2019-12-04')
    datetime.date(2019, 12, 4)
    
    This is the inverse of date.isoformat(). It only supports the format YYYY-MM-DD.
    
    New in version 3.7.
    

    【讨论】:

    • doh...你知道旧版 python 3 实例的替代方案吗?
    • 也许this 就是你要找的东西
    • isoformat() 似乎具有相反的效果,因为它转换为 ISO8601 格式。我会寻找替代解决方案。谢谢顺便说一句
    【解决方案2】:

    我遇到了同样的问题,发现了这个:

    https://pypi.org/project/backports-datetime-fromisoformat/

    >>> from datetime import date, datetime, time
    >>> from backports.datetime_fromisoformat import MonkeyPatch
    >>> MonkeyPatch.patch_fromisoformat()
    
    >>> datetime.fromisoformat("2014-01-09T21:48:00-05:30")
    datetime.datetime(2014, 1, 9, 21, 48, tzinfo=-05:30)
    
    >>> date.fromisoformat("2014-01-09")
    datetime.date(2014, 1, 9)
    
    >>> time.fromisoformat("21:48:00-05:30")
    datetime.time(21, 48, tzinfo=-05:30)
    

    像魅力一样工作。

    【讨论】:

    • 效果很好,但是datetime.datetime 中是否有类似timedelta 的功能。你怎么能在这里增加日期?
    • 它的工作方式与您预期的一样。由于您仍然导入 datetime 并仅更新 fromisoformat 其余部分保持不变。
    【解决方案3】:

    您应该像这样重构datetime.fromisoformat('2021-08-12') 以使用datetime.strptime

    In [1]: from datetime import datetime                                                                                                                                                          
    
    In [2]: datetime.strptime("2021-08-08", "%Y-%m-%d")                                                                                                                                           
    Out[2]: datetime.datetime(2021, 8, 8, 0, 0)
    

    【讨论】:

      【解决方案4】:

      Python 3.6 及更早版本没有 fromisoformat() 方法 - 如其他文档中所述 - 两者 datetime.fromisoformat (docs) 和 date.fromisoformat (docs) 是不可用。

      您可以使用我编写的这段代码在 Python 3.6 中实现它。我不想为我几乎不使用的函数安装额外的依赖项——在我的例子中,我只在测试中使用它。

      Python3.6及以下

      from datetime import datetime
      
      time_expected = datetime.now()
      time_actual = datetime.strptime(time_actual.isoformat(), "%Y-%m-%dT%H:%M:%S.%f")
      assert time_actual == time_expected
      

      Python3.7+

      from datetime import datetime
      
      time_expected = datetime.now()
      time_actual = datetime.fromisoformat(time_expected.isoformat())
      assert time_actual == time_expected
      

      【讨论】:

        【解决方案5】:

        你不应该使用from datetime import datetime,而是import datetime,你只是混淆了模块的命名。 现在你可以使用datetime.fromisoformat(duedate)

        【讨论】:

        • 我试过但我有类似的错误:AttributeError: module 'datetime' has no attribute 'fromisoformat'
        • 它在 python 3.7 和 3.8 中工作,因为在 Python 3.7 中添加了 fromisoformat。
        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 2013-08-23
        • 2015-05-17
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        相关资源
        最近更新 更多