web-dev-qa-db-ja.com

python "インポート日時" v.s. "日時インポート日時から"

スクリプトのさまざまな行で次を実行する必要があるスクリプトがあります。

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

インポートステートメントには、次のものがあります。

from datetime import datetime
import datetime

次のエラーが表示されます。

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

インポートステートメントの順序を次のように変更した場合:

import datetime
from datetime import datetime

次のエラーが表示されます。

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

インポートステートメントを再度変更した場合:

import datetime

次のエラーが表示されます。

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

ここで何が起こっており、両方を機能させるにはどうすればよいですか?感謝します。ありがとうございました。

34
codingknob

あなたの問題は、datetimedatetimemoduleおよびその他への参照であることを期待しているコードがあることです。 datetimedatetimeクラスへの参照であることを期待しているコード。明らかに両方ではない。

行うとき:

_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はクラスを意味します。

62
kindall

両方のステートメントを使用することはできません。 datetimeモジュールにはdatetimetypeが含まれます。独自モジュールのローカル名datetimeは、どちらか一方のみを参照できます。

onlyimport datetimeを使用し、常にdatetime.datetimeを使用して、含まれている型を参照するようにします。

import datetime

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

これでdatetimeがモジュールになり、そこから含まれている型を参照します。

または、モジュールから必要なタイプをインポートall

from datetime import date, datetime

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

ここで、datetimeはモジュールの型です。 dateは、同じモジュールの別のタイプです。

24
Martijn Pieters

datetimeは、datetimeとも呼ばれるタイプを含むモジュールです。両方を使用したいようですが、両方を参照するために同じ名前を使用しようとしています。タイプとモジュールは2つの異なるものであり、プログラムで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')

ここでは、必要な名前(日時と日付タイプ)のみをインポートし、それらを直接インポートするため、モジュール自体を参照する必要はまったくありません。

最終的には、使用する必要のあるモジュールの名前と、それらの最適な使用方法を決定する必要があります。モジュールから1つまたは2つのもの(たとえば、dateおよびdatetimeタイプのみ)のみを使用している場合、それらの名前を直接インポートしてもかまいません。多くのものを使用している場合は、モジュールをインポートし、ドット構文を使用してその中にあるものにアクセスし、グローバルな名前空間が日付固有の名前で乱雑にならないようにする方がよいでしょう。

また、モジュール名自体をインポートする場合は、名前を短くして入力しやすくすることもできます。

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

Datetime import datetimeと通常のimport datetimeとの違いは、あるモジュールを処理し、別のクラスを処理することです。

Strptime関数はdatetimeクラスにのみ存在するため、モジュールと共にクラスをインポートする必要があります。そうでない場合、この関数を呼び出すときにdatetimeを2回指定する必要があります。

ここで重要なのは、クラス名とモジュール名に同じ名前が付けられているため、少し混乱を招くことです。

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

これを試して:

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を意味すると思います。

0
Yarkee