web-dev-qa-db-fra.com

python "import datetime" v.s. "depuis datetime import datetime"

J'ai un script qui doit exécuter les éléments suivants à différentes lignes du script:

today_date = datetime.date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')

Dans mes déclarations d'importation, j'ai les éléments suivants:

from datetime import datetime
import datetime

Je reçois l'erreur suivante:

AttributeError: 'module' object has no attribute 'strp'

Si je change l'ordre des instructions d'importation en:

import datetime
from datetime import datetime

Je reçois l'erreur suivante:

AttributeError: 'method_descriptor' object has no attribute 'today'

Si je modifie à nouveau la déclaration d'importation en:

import datetime

Je reçois l'erreur suivante:

AttributeError: 'module' object has no attribute 'strp'

Que se passe-t-il ici et comment puis-je faire fonctionner les deux? L'apprécier. Je vous remercie. 

32
codingknob

Votre problème est que vous avez du code qui s'attend à ce que datetime soit une référence à datetimemodule et à un autre code qui s'attend à ce que datetime soit une référence à datetimeclasse. Évidemment, ça ne peut pas être les deux. 

Quand tu fais:

from datetime import datetime
import datetime

Vous définissez d'abord datetime pour qu'il soit une référence à la classe, puis vous le définissez immédiatement pour qu'il soit une référence au module. Lorsque vous le faites en sens inverse, c'est la même chose, mais cela finit par être une référence à la classe.

Vous devez renommer l'une de ces références. Par exemple:

import datetime as dt
from datetime import datetime

Ensuite, vous pouvez modifier les références sous la forme datetime.xxxx qui font référence au module en dt.xxxx.

Sinon, il suffit de import datetime et de modifier toutes les références pour utiliser le nom du module. En d'autres termes, si quelque chose dit simplement datetime(...), vous devez changer cette référence en datetime.datetime.

Python a malheureusement pas mal de ce genre de chose dans sa bibliothèque. S'ils suivaient leurs propres directives de nommage dans PEP 8 , la classe datetime serait nommée Datetime et il n'y aurait aucun problème à utiliser à la fois datetime pour désigner le module et Datetime pour désigner la classe.

58
kindall

Vous ne pouvez pas utiliser les deux instructions. la datetimemodule contient une datetimetype. Le nom local datetime dans votre propre module ne peut faire référence qu’à l’un ou l’autre.

Utilisez onlyimport datetime, puis assurez-vous de toujours utiliser datetime.datetime pour faire référence au type contenu:

import datetime

today_date = datetime.date.today()
date_time = datetime.datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')

Maintenant, datetime est le module, et vous vous référez aux types contenus via cela.

Vous pouvez également importer les types all dont vous avez besoin à partir du module:

from datetime import date, datetime

today_date = date.today()
date_time = datetime.strptime(date_time_string, '%Y-%m-%d %H:%M')

Ici datetime est le type du module. date est un autre type, issu du même module.

23
Martijn Pieters

datetime est un module qui contient un type également appelé datetime. Vous semblez vouloir utiliser les deux, mais vous essayez d'utiliser le même nom pour désigner les deux. Le type et le module sont deux choses différentes et vous ne pouvez pas vous référer aux deux avec le nom datetime dans votre programme.

Si vous devez utiliser quelque chose du module en plus du type datetime (comme vous le faites apparemment), vous devez importer le module avec import datetime. Vous pouvez ensuite faire référence au type "date" en tant que datetime.date et au type datetime en tant que datetime.datetime.

Vous pouvez aussi faire ceci:

from datetime import datetime, date
today_date = date.today()
date_time = datetime.strp(date_time_string, '%Y-%m-%d %H:%M')

Ici, vous importez uniquement les noms dont vous avez besoin (les types date/heure) et vous les importez directement afin que vous n'ayez pas besoin de faire référence au module lui-même.

En fin de compte, vous devez décider quels noms du module vous devez utiliser et quelle est la meilleure façon de les utiliser. Si vous utilisez uniquement un ou deux éléments du module (par exemple, uniquement les types date et datetime), vous pouvez importer ces noms directement. Si vous utilisez beaucoup d'éléments, il est probablement préférable d'importer le module et d'accéder à ses éléments à l'aide de la syntaxe à points afin d'éviter d'encombrer votre espace de noms global de noms spécifiques à la date.

Notez également que, si vous importez le nom du module lui-même, vous pouvez le raccourcir pour faciliter la frappe:

import datetime as dt
today_date = dt.date.today()
date_time = dt.datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
2
BrenBarn

La différence entre datetime datetime import et datetime normal est que vous avez affaire à un module à un moment donné et à une classe à un autre.

La fonction strptime n'existe que dans la classe datetime. Vous devez donc importer la classe avec le module. Sinon, vous devez spécifier datetime deux fois lorsque vous appelez cette fonction.

Le problème ici est que le nom de la classe et le nom du module ont reçu le même nom, ce qui crée un peu de confusion.

1
Lakshaya Maheshwari
from datetime import datetime,timedelta
today=datetime.today()
print("Todays Date:",today)
yesterday=today-datetime,timedelta(days=1)
print("Yesterday date:",yesterday)
tommorrow=today+datetime.timedelta(days=1)
print("Tommorrow Date:",tommorrow)
0

essaye ça:

import datetime
from datetime import datetime as dt

today_date = datetime.date.today()
date_time = dt.strptime(date_time_string, '%Y-%m-%d %H:%M')

strp () n'existe pas. Je pense que tu veux dire strptime.

0
Yarkee