python“import datetime”vs.s. “从日期时间导入日期时间”

时间:2013-03-29 16:42:23

标签: python datetime attributeerror

我有一个脚本需要在脚本的不同行执行以下命令:

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

在我的import语句中,我有以下内容:

from datetime import datetime
import datetime

我收到以下错误:

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

如果我将import语句的顺序更改为:

import datetime
from datetime import datetime

我收到以下错误:

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

如果我再次将import语句更改为:

import datetime

我收到以下错误:

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

这里发生了什么,如何让两者兼顾?欣赏它。谢谢。

6 个答案:

答案 0 :(得分:59)

您的问题是您有一些代码期望datetime成为datetime 模块的引用,以及其他期望datetime的代码是对datetime 类的引用。显然,它不能同时存在。

当你这样做时:

from datetime import datetime
import datetime

您首先将datetime设置为对类的引用,然后立即将其设置为对模块的引用。当你以相反的方式做到这一点时,它也是一样的,但它最终成为了对类的引用。

您需要重命名其中一个引用。例如:

import datetime as dt
from datetime import datetime

然后,您可以将引用该模块的datetime.xxxx表单中的引用更改为dt.xxxx

或者只是import datetime并更改所有引用以使用模块名称。换句话说,如果只是说datetime(...),则需要将该引用更改为datetime.datetime

不幸的是,Python在它的库中有很多类似的东西。如果他们在PEP 8中遵循了他们自己的命名准则,则datetime类将被命名为Datetime,并且使用datetime来表示模块和{{{ 1}}表示班级。

答案 1 :(得分:24)

你不能同时使用这两种说法; datetime 模块包含datetime 类型。您自己模块中的本地名称datetime只能引用其中一个。

仅使用 import datetime,然后确保始终使用datetime.datetime来引用所包含的类型:

import datetime

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

现在datetime是模块,您可以通过它来引用包含的类型。

或者,从模块中导入所需的所有类型:

from datetime import date, datetime

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

此处datetime是模块中的类型。 date是另一种类型,来自同一模块。

答案 2 :(得分:2)

datetime是一个模块,其中包含一个也称为datetime的类型。您似乎想要同时使用两者,但是您尝试使用相同的名称来同时引用它们。类型和模块是两个不同的东西,您不能在程序中使用名称datetime来引用它们。

如果您需要使用除datetime类型之外的模块中的任何内容(如您所示),则需要使用import datetime导入模块。然后,您可以将“日期”类型称为datetime.date,将日期时间类型称为datetime.datetime

你也可以这样做:

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

在这里,您只导入所需的名称(日期时间和日期类型)并直接导入它们,这样您根本不需要参考模块本身。

最终,您必须确定您需要使用的模块中的名称,以及如何最好地使用它们。如果您只使用模块中的一两件事(例如,只有datedatetime类型),则可以直接导入这些名称。如果您使用了很多东西,最好导入模块并使用点语法访问其中的内容,以避免使用特定于日期的名称来混淆全局命名空间。

另请注意,如果您确实导入了模块名称,则可以缩短名称以方便输入:

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

答案 3 :(得分:1)

从日期时间导入日期时间到正常导入日期时间之间的区别在于,您一次处理一个模块而另一个处理一个类。

strptime函数仅存在于datetime类中,因此您必须使用模块导入类,否则在调用此函数时必须指定两次datetime。

这里的事情是,类名和模块名被赋予相同的名称,因此它会产生一些混淆。

答案 4 :(得分:0)

试试这个:

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()不存在。我认为你的意思是strptime。

答案 5 :(得分:0)

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)