类型对象'datetime.datetime'没有属性'datetime'。

236

我遇到了以下错误:

type object 'datetime.datetime' has no attribute 'datetime'

错误发生在以下一行代码:

date = datetime.datetime(int(year), int(month), 1)

有人知道这个错误的原因吗?

我使用 from datetime import datetime 导入了 datetime,如果这有帮助的话。

谢谢

15个回答

349

Datetime是一个模块,允许处理日期、时间和日期时间(所有这些都是数据类型)。这意味着datetime既是顶级模块,也是该模块中的一种类型。这很令人困惑。

你的错误可能是基于模块的混淆命名以及你或你正在使用的模块已导入了它。

>>> import datetime
>>> datetime
<module 'datetime' from '/usr/lib/python2.6/lib-dynload/datetime.so'>
>>> datetime.datetime(2001,5,1)
datetime.datetime(2001, 5, 1, 0, 0)

但是,如果你导入datetime.datetime:

>>> from datetime import datetime
>>> datetime
<type 'datetime.datetime'>
>>> datetime.datetime(2001,5,1) # You shouldn't expect this to work 
                                # as you imported the type, not the module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
>>> datetime(2001,5,1)
datetime.datetime(2001, 5, 1, 0, 0)

我怀疑你或者你正在使用的模块已经这样导入了: from datetime import datetime

6
@Jean 这是 datetime 在使用其中一个类名作为模块名称时发生了自身模块名称重叠的错误,而不是 Python 的问题。 - Robino
7
这是datetime中最令人沮丧和愚蠢的方面之一。编写该程序的人应该进行一些重构。 - Nav

175

针对Python 3.3版本

from datetime import datetime, timedelta
futuredate = datetime.now() + timedelta(days=10)

17
我认为这应该是正确答案,因为据我所知,“import datetime”总是会引起问题,因此我支持使用“from datetime import datetime”的解决方案。 - jeff
这是最佳答案。其他答案令人困惑。这应该被接受为答案。 - Akash Dahane
我个人很喜欢这个示例,因为它展示了使用from X import Y方法时timedelta的正确用法。 - Source Matters

28

你应该将这个模块导入到它自己的别名中。

import datetime as dt
my_datetime = dt.datetime(year, month, day)

相对于其他解决方案,上述方法具有以下优点:

  • 将变量称为my_datetime而不是date可以减少混淆,因为在datetime模块中已经有一个date了(datetime.date)。
  • 模块和类(都称为datetime)不会互相遮蔽。

对我来说,这真的是避免在 datetime 和 datetime.datetime 之间重复混淆的最佳解决方案。 - 8forty

24

您应该使用

date = datetime(int(year), int(month), 1)

或更改

from datetime import datetime

to

import datetime

8
如果您使用过:
from datetime import datetime

然后只需要按照以下代码编写:

date = datetime(int(year), int(month), 1)

但是如果您使用过以下内容:
import datetime

只有这样,您才能编写:

然后只有您才能编写:

date = datetime.datetime(int(2005), int(5), 1)

5

我遇到了相同的错误,也许你已经仅使用import datetime导入了模块,因此请将from datetime import datetime更改为仅import datetime。在我将它改回去后,它对我起作用了。


1
form是打错了吗?看起来应该是from - Yunnosch

3
import time
import datetime
from datetime import date,timedelta

你必须从datetime中导入datetime。

2

避免编写以下内容:

from datetime import datetime
datetime.datetime.function()

解决方案1:

import datetime
datetime.datetime.function()

方案二:

from datetime import datetime
datetime.function()

2

我发现这样做要容易得多

from dateutil import relativedelta
relativedelta.relativedelta(end_time,start_time).seconds

1
你可以直接运行下面的命令。
导入 datetime datetime.fromtimestamp(details.start_date).strftime("%Y-%m-%d %H:%M:%S")

我不确定那真正回答了提问者的问题;其他一些答案似乎解决了关键问题。 - Dragon

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