229

I have gotten the following error:

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

On the following line:

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

Does anybody know the reason for the error?

I imported datetime with from datetime import datetime if that helps

Thanks

Chris Frank
  • 4,124
  • 4
  • 30
  • 42

14 Answers14

344

Datetime is a module that allows for handling of dates, times and datetimes (all of which are datatypes). This means that datetime is both a top-level module as well as being a type within that module. This is confusing.

Your error is probably based on the confusing naming of the module, and what either you or a module you're using has already imported.

>>> 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)

But, if you import 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)

I suspect you or one of the modules you're using has imported like this: from datetime import datetime.

John Lyon
  • 11,180
  • 4
  • 36
  • 44
  • 6
    @Jean this is the fault of datetime shadowing its own module's name with one of its class names, not python's. – Robino Feb 16 '18 at 12:34
  • 7
    This is one of the most frustratingly silly aspects of `datetime`. The person who programmed it should do some refactoring. – Nav Feb 23 '22 at 15:37
169

For python 3.3

from datetime import datetime, timedelta
futuredate = datetime.now() + timedelta(days=10)
RouR
  • 6,136
  • 3
  • 34
  • 25
  • 17
    +1. I think this should be the correct answer because as far as I know, `import datetime` always causes problems, so I'm in favor of a solution which uses `from datetime import datetime` – jeff Feb 24 '15 at 18:54
  • This is the best answer. Other answers are confusing. This should have been the accepted answer. – Akash Dahane Mar 28 '21 at 14:58
  • I personally liked this one because it showed the correct usage of timedelta when using the from X import Y method. – Source Matters Apr 22 '21 at 02:44
26

You should really import the module into its own alias.

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

The above has the following benefits over the other solutions:

  • Calling the variable my_datetime instead of date reduces confusion since there is already a date in the datetime module (datetime.date).
  • The module and the class (both called datetime) do not shadow each other.
Robino
  • 4,530
  • 3
  • 37
  • 40
  • To me this is really the best solution to avoid the repeated confusion between datetime... and datetime.datetime... – 8forty May 10 '23 at 22:35
22

You should use

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

Or change

from datetime import datetime

to

import datetime
waitingkuo
  • 89,478
  • 28
  • 112
  • 118
6

If you have used:

from datetime import datetime

Then simply write the code as:

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

But if you have used:

import datetime

then only you can write:

date = datetime.datetime(int(2005), int(5), 1)
M. Paul
  • 361
  • 5
  • 18
4

I run into the same error maybe you have already imported the module by using only import datetime so change from datetime import datetime to only import datetime. It worked for me after I changed it back.

SeaDude
  • 3,725
  • 6
  • 31
  • 68
Audrey Mengue
  • 169
  • 2
  • 6
3
import time
import datetime
from datetime import date,timedelta

You must have imported datetime from datetime.

GooDeeJAY
  • 1,681
  • 2
  • 20
  • 27
2

I found this to be a lot easier

from dateutil import relativedelta
relativedelta.relativedelta(end_time,start_time).seconds
Kamaldeep Singh
  • 492
  • 4
  • 8
1

Avoid to write:

from datetime import datetime
datetime.datetime.function()

Solution No. 1:

import datetime
datetime.datetime.function()

Solution No. 2:

from datetime import datetime
datetime.function()
1

You can simply run the below command.

import datetime

datetime.fromtimestamp(details.start_date).strftime("%Y-%m-%d %H:%M:%S")

  • I'm not sure that really answers the question the person wrote; a number of the other answers seem to address the key problem – Dragon Apr 12 '23 at 01:54
0
from datetime import datetime
import time
from calendar import timegm
d = datetime.utcnow()
d = d.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
utc_time = time.strptime(d,"%Y-%m-%dT%H:%M:%S.%fZ")
epoch_time = timegm(utc_time)
  • 11
    Try to avoid code-only answers. You can [edit] your post to add some explanations and links to support your code. – Tomerikoo Mar 30 '20 at 07:36
0

delete one datetime from:

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

and you get this:

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

you already imported the first one with this:

from datetime import datetime

so its redundant.

Carlost
  • 478
  • 5
  • 13
0

I tried :

import datetime 
from datetime import timedelta

and it worked somewhat

Roshin Raphel
  • 2,612
  • 4
  • 22
  • 40
-3

The Problem Is That You Are Using The Tag

from datetime

I had The Same Problem You Need To use It Like This Instead

import datetime
ApplePie
  • 8,814
  • 5
  • 39
  • 60
  • Hey, welcome to SO. I am not a downvoter but suspect you are getting downvoted because this isn't completely correct, and you could make use of formatting tags to make your code references clearer. – ApplePie Nov 22 '22 at 23:30