obiekt typu „datetime.datetime” nie ma atrybutu „datetime”


127

Otrzymałem następujący błąd:

obiekt typu „datetime.datetime” nie ma atrybutu „datetime”

W następującym wierszu:

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

Czy ktoś zna przyczynę błędu?

Zaimportowałem datę i godzinę z, from datetime import datetimejeśli to pomaga

Dzięki

Odpowiedzi:


225

Datetime to moduł, który umożliwia obsługę dat, godzin i czasów (z których wszystkie są typami danych). Oznacza to, że datetimejest to zarówno moduł najwyższego poziomu, jak i typ w tym module. To jest mylące.

Twój błąd prawdopodobnie wynika z mylącego nazewnictwa modułu i tego, co Ty lub moduł, którego używasz, już zaimportowałeś.

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

Ale jeśli zaimportujesz 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)

Podejrzewam, że albo jeden z modułów jesteś wykorzystaniem importowanych tak: from datetime import datetime.


3
@jozzas świetna odpowiedź. Miałem problem z timedelta, który został rozwiązany za pomocą twojego rozwiązania. Txs.
Luis Miguel

1
@Jean to wina datetime shadowania nazwy własnego modułu jedną z jego nazw klas, a nie Pythona.
Robino,

85

W przypadku Pythona 3.3

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

12
+1. Myślę, że to powinna być poprawna odpowiedź, ponieważ o ile wiem, import datetimezawsze powoduje problemy, więc jestem zwolennikiem rozwiązania, które wykorzystujefrom datetime import datetime
jeff

14

Powinieneś użyć

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

Albo zmień

from datetime import datetime

do

import datetime

11

Naprawdę powinieneś zaimportować moduł do jego własnego aliasu .

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

Powyższe ma następujące zalety w stosunku do innych rozwiązań:

  • Wywołanie zmiennej my_datetimezamiast datezmniejsza zamieszanie, ponieważ istnieje już datew module datetime ( datetime.date).
  • Moduł i klasa (obie wywołane datetime) nie przesłaniają się nawzajem.

1

Jeśli użyłeś:

from datetime import datetime

Następnie po prostu napisz kod jako:

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

Ale jeśli użyłeś:

import datetime

wtedy tylko ty możesz napisać:

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

1

Okazało się, że jest to o wiele łatwiejsze

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

1

Napotkam ten sam błąd, może już zaimportowałeś moduł używając tylko import datetimewięc zmień form datetime import datetimetylko import datetime. Zadziałało dla mnie po tym, jak to zmieniłem.


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

6
Staraj się unikać odpowiedzi zawierających tylko kod. Możesz edytować swój post, aby dodać wyjaśnienia i linki do obsługi Twojego kodu.
Tomerikoo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.