58

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

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'

这里发生了什么,我如何让两者都工作?

4

6 回答 6

85

您的问题是您有一些代码期望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表示模块又Datetime表示类没有问题。

于 2013-03-29T16:48:57.717 回答
35

你不能同时使用这两个语句;该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是另一种类型,来自同一模块。

于 2013-03-29T16:44:10.177 回答
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')

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

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

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

import datetime as dt
today_date = dt.date.today()
date_time = dt.datetime.strp(date_time_string, '%Y-%m-%d %H:%M')
于 2013-03-29T16:49:13.367 回答
2

from datetime import datetime 和普通 import datetime 之间的区别在于,您一次处理一个模块,另一次处理一个类。

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

这里的问题是,类名和模块名已被赋予相同的名称,因此会产生一些混乱。

于 2016-01-20T05:20:02.617 回答
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。

于 2013-03-29T16:48:00.103 回答
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)
于 2019-01-28T16:25:58.553 回答