datetime モジュール 重複が多すぎて非道す

dir() を並べました datetime.datetime / datetime.date / datetime.time / time

これを見ると日時の操作はdatetime.datetimeを使い、時間の計測timeを使えば良いと分かる

モジュールモジュールモジュールモジュール
datetime.datetimedatetime.datedatetime.timetime
__add____add___STRUCT_TM_ITEMS
 __class__ __class____class__
 __delattr__ __delattr__ __delattr__
 __dir__ __dir__ __dir__
 __doc__ __doc__ __doc__ __doc__
 __eq__ __eq__ __eq__ __loader__
 __format__ __format__ __format__ __name__
 __ge__ __ge__ __ge__ __package__
 __getattribute__ __getattribute__ __getattribute__ __spec__
 __gt__ __gt__ __gt__
 __hash__ __hash__ __hash__
 __init__ __init__ __init__
 __init_subclass__ __init_subclass__ __init_subclass__
 __le__ __le__ __le__
 __lt__ __lt__ __lt__
 __ne__ __ne__ __ne__
 __new__ __new__ __new__
 __radd__ __radd__
 __reduce__ __reduce__ __reduce__
 __reduce_ex__ __reduce_ex__ __reduce_ex__
 __repr__ __repr__ __repr__
 __rsub__ __rsub__ __setattr__
 __setattr__ __setattr__ __sizeof__
 __sizeof__ __sizeof__ __str__
 __str__ __str__
 __sub__ __sub__
 __subclasshook__ __subclasshook__ __subclasshook__
————–————–————
 astimezone altzone
 combine asctime
 ctime ctime ctime
 date daylight
 day day get_clock_info
 dst dst gmtime
 fold fold localtime
 fromisocalendar fromisocalendar fromisoformat mktime
 fromisoformat fromisoformat monotonic
 fromordinal fromordinal monotonic_ns
 fromtimestamp fromtimestamp perf_counter
 hour hour perf_counter_ns
 isocalendar isocalendar process_time
 isoformat isoformat isoformat process_time_ns
 isoweekday isoweekday sleep
 max max max
 microsecond microsecond
 min min min
 minute minute
 month month
 now
 replace replace replace
 resolution resolution resolution
 second second
 strftime strftime strftime strftime
 strptime strptime
 time struct_time
 timestamp timetuple thread_time
 timetuple thread_time_ns
 timetz time
 today today time_ns
 toordinal toordinal
 tzinfo tzinfo timezone
 tzname tzname tzname
 utcfromtimestamp
 utcnow
 utcoffset utcoffset
 utctimetuple
 weekday weekday
 year year

大変ためになる先輩の講義内容を引用させていただいています

自分で見て理解したら本文は消します。

datetimeモジュールで日付や時刻を操作する
datetimeモジュール標準ライブラリのdatetimeモジュールをインポートすると、日付や時刻を表すオブジェクトを扱えるようになります。 datetime.datedatetime.date は日付を扱うためのクラスです。西暦 (yea

丸写ししてます。引用です。

‘datetime’

dir(datetime)

[ ‘MAXYEAR’, ‘MINYEAR’,’date’, ‘datetime’, ‘datetime_CAPI’, ‘sys’, ‘time’, ‘timedelta’, ‘timezone’, ‘tzinfo’]

‘datetime.date’

[ ‘ctime’, ‘day’, ‘fromisoformat’, ‘fromordinal’, ‘fromtimestamp’, ‘isocalendar’, ‘isoformat’, ‘isoweekday’, ‘max’, ‘min’, ‘month’, ‘replace’, ‘resolution’, ‘strftime’, ‘timetuple’, ‘today’, ‘toordinal’, ‘weekday’, ‘year’]

datetime.date は日付を扱うためのクラスです。西暦 (year), 月 (month), 日 (day) を引数に渡してインスタンスを作成します。3 つの引数は省略できません。

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成
# 2018年10月15日
x = datetime.date(2018, 10, 15)

# xのもつデータを表示
print("日付 :", x)

# xのクラスを表示
print("クラス :", type(x))

# インスタンス変数を使って年月日を表示
print(x.year, "年", x.month, "月", x.day, "日")

日付 : 2018-10-15
クラス : <class 'datetime.date'>
2018 年 10 月 15 日

西暦 (year), 月 (month), 日 (day) は読み出し専用のインスタンス変数(データ属性)としてオブジェクトに保存されます。たとえば

datetime.[dateオブジェクト].year

と記述すると、オブジェクトから西暦を取り出すことができます。

‘datetime.datetime’

[ ‘astimezone’, ‘combine’, ‘ctime’, ‘date’, ‘day’, ‘dst’, ‘fold’, ‘fromisoformat’, ‘fromordinal’, ‘fromtimestamp’, ‘hour’, ‘isocalendar’, ‘isoformat’, ‘isoweekday’, ‘max’, ‘microsecond’, ‘min’, ‘minute’, ‘month’, ‘now’, ‘replace’, ‘resolution’, ‘second’, ‘strftime’, ‘strptime’, ‘time’, ‘timestamp’, ‘timetuple’, ‘timetz’, ‘today’, ‘toordinal’, ‘tzinfo’, ‘tzname’, ‘utcfromtimestamp’, ‘utcnow’, ‘utcoffset’, ‘utctimetuple’, ‘weekday’, ‘year’]

datetime.datetime は日時を扱うためのクラスです。西暦 (year), 月 (month), 日 (day), 時 (hour), 分 (minute), 秒 (second), ミリ秒 (millisecond) を引数に渡してインスタンスを作成できます。下のサンプルコードでは datetime.datetime.now()メソッド現在時刻を取得しています。

# datetimeモジュールをインポート
import datetime

# datetimeオブジェクトのnowメソッドで現在の日付と時刻を取得
x = datetime.datetime.now()

# xのもつデータを表示
print("日付と時刻 :",x)

# インスタンス変数を使って年月日を表示
print(x.year, "年", x.month, "月", x.day, "日")

# インスタンス変数を使って時刻を表示
print(x.hour, "時", x.minute, "分", x.second, "秒")

# 日付と時刻のデータをタプルで取得
print(x.timetuple())
日付と時刻 : 2018-10-25 11:51:56.860432
2018 年 10 月 25 日
11 時 51 分 56 秒
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=25, tm_hour=15,
tm_min=38, tm_sec=5, tm_wday=3, tm_yday=298, tm_isdst=-1)

datetime.datetime.timetuple() は、日付と時刻のデータをタプルで取得するメソッドです。実行結果の tm_wday は月曜日を 0 , 日曜日を 6 とした曜日番号を表しています。tm_yday はその年の 1 月 1 日から数えた経過日数です。

曜日番号の取得

datetime.dateオブジェクト、または datetime.datetimeオブジェクトの weekday()メソッドは月曜日を 0 , 日曜日を 6 とした曜日番号を返します。たとえば 2018年12月10日の曜日番号は、次のようなコードで取得することができます。

# datetimeモジュールをインポート
import datetime

# 2018年12月10日
x = datetime.date(2018, 12, 10)

# 曜日番号を取得
print(x.weekday())
0

次のサンプルコードを実行すると、12月10日から12月16日までの曜日番号を表示させることができます。

# 12月10日~12月16日の曜日番号を表示

# datetimeモジュールをインポート
import datetime

# 日付差 dt = 1
dt = datetime.timedelta(1)

# 起点日時 (2018年12月9日)
x = datetime.date(2018, 12, 9)

# 日付と曜日番号を表示
for k in range(7):
    x += dt
    print(x, " 曜日番号", x.weekday())
2018-12-10  曜日番号 0
2018-12-11  曜日番号 1
2018-12-12  曜日番号 2
2018-12-13  曜日番号 3
2018-12-14  曜日番号 4
2018-12-15  曜日番号 5
2018-12-16  曜日番号 6

weekday() によく似たメソッドに isoweekday() がありますが、こちらは月曜日を 1 , 日曜日を 7 とした曜日番号を返します。

日時を文字列に変換

文字列の format()メソッドの引数に日時のデータを渡すと文字列型に変換して返します。日時の表示形式を指定することもできます。

# datetimeモジュールをインポート
import datetime

# datetime.datetimeクラスのインスタンスを作成
# 2018年5月8日17時2分9秒
x = datetime.datetime(2018, 5, 8, 17, 2, 9)

# 西暦を4桁、月を下2桁、日を下2桁で表示
print("{:%Y/%m/%d}".format(x))

# 西暦を2桁、月を下2桁、日を下2桁で表示
print("{:%y/%m/%d}".format(x))

# 時を24時間表記、分を2桁、秒を2桁で表示
print("{:%H:%M:%S}".format(x))

# 時を12時間表記、分を2桁、秒を2桁で表示
print("{:%I:%M:%S}".format(x))

# AM,PMの表記、時を12時間表記、分を2桁、秒を2桁で表示
print("{:%p%I:%M:%S}".format(x))

2018/05/08
18/05/08
17:02:09
05:02:09
PM05:02:09

‘datetime.time’

[ ‘dst’, ‘fold’, ‘fromisoformat’, ‘hour’, ‘isoformat’, ‘max’, ‘microsecond’, ‘min’, ‘minute’, ‘replace’, ‘resolution’, ‘second’, ‘strftime’, ‘tzinfo’, ‘tzname’, ‘utcoffset’]

‘datetime.timedelta’

[ ‘days’, ‘max’, ‘microseconds’, ‘min’, ‘resolution’, ‘seconds’, ‘total_seconds’]

2018年11月21日から 2018年11月20日を差し引くと、1 day という値が返ります:

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成

# 2018年11月21日
x = datetime.date(2018, 11, 21)

# 2018年11月20日
y = datetime.date(2018, 11, 20)

# 2018年11月21日と2018年11月20日の差を計算
print(x-y)

# x-yのクラスを表示
print(type(x-y))
1 day, 0:00:00

日時の差分 x-y のクラスを調べると、datetime.timedelta が表示されています。datetime.timedelta は日時の差を扱うクラスであり、日時の差をとると、datetime.timedeltaクラスのインスタンスが自動的に生成されます。datetime.timedeltaオブジェクトを使って日時の加算を実行することもできます。次のサンプルコードでは、datetime.timedeltaオブジェクトを使って、2018年5月10日から100日後の日付を求めています。

# datetimeモジュールをインポート
import datetime

# datetime.dateクラスのインスタンスを作成
# 2018年5月10日
x = datetime.date(2018, 5, 10)

# datetime.timedeltaクラスのインスタンスを作成
dx = datetime.timedelta(100)

# 2018年5月10日から100日後の日付を表示
print(x + dx)
2018-08-18

曜日の表示

曜日 (day of the week) のリストを用意しておけば、日時データに対応する曜日を表示させることができます。曜日番号はリストの各要素を参照するためのインデックス番号として用います。

# 12月10日から12月16日までの曜日を表示

# datetimeモジュールをインポート
import datetime

# 曜日(day of the week)のリスト
dweek = ["月", "火", "水", "木", "金", "土", "日"]

# 日付差 dt = 1
dt = datetime.timedelta(1)

# 起点日時 (2018年12月9日)
x = datetime.date(2018, 12, 9)

# 日付と曜日を表示
for k in range(7):
    x += dt
    print(x, dweek[x.weekday()])
2018-12-10 月
2018-12-11 火
2018-12-12 水
2018-12-13 木
2018-12-14 金
2018-12-15 土
2018-12-16 日

‘datetime.sys’

[ ‘api_version’, ‘argv’, ‘base_exec_prefix’, ‘base_prefix’, ‘breakpointhook’, ‘builtin_module_names’, ‘byteorder’, ‘call_tracing’, ‘callstats’, ‘copyright’, ‘displayhook’, ‘dllhandle’, ‘dont_write_bytecode’, ‘exc_info’, ‘excepthook’, ‘exec_prefix’, ‘executable’, ‘exit’, ‘flags’, ‘float_info’, ‘float_repr_style’, ‘get_asyncgen_hooks’, ‘get_coroutine_origin_tracking_depth’, ‘get_coroutine_wrapper’, ‘getallocatedblocks’, ‘getcheckinterval’, ‘getdefaultencoding’, ‘getfilesystemencodeerrors’, ‘getfilesystemencoding’, ‘getprofile’, ‘getrecursionlimit’, ‘getrefcount’, ‘getsizeof’, ‘getswitchinterval’, ‘gettrace’, ‘getwindowsversion’, ‘hash_info’, ‘hexversion’, ‘implementation’, ‘int_info’, ‘intern’, ‘is_finalizing’, ‘maxsize’, ‘maxunicode’, ‘meta_path’, ‘modules’, ‘path’, ‘path_hooks’, ‘path_importer_cache’, ‘platform’, ‘prefix’, ‘set_asyncgen_hooks’, ‘set_coroutine_origin_tracking_depth’, ‘set_coroutine_wrapper’, ‘setcheckinterval’, ‘setprofile’, ‘setrecursionlimit’, ‘setswitchinterval’, ‘settrace’, ‘stderr’, ‘stdin’, ‘stdout’, ‘thread_info’, ‘version’, ‘version_info’, ‘warnoptions’, ‘winver’]

‘datetime.timezone’

[ ‘dst’, ‘fromutc’, ‘max’, ‘min’, ‘tzname’, ‘utc’, ‘utcoffset’]

‘datetime.tzinf’

[ ‘dst’, ‘fromutc’, ‘tzname’, ‘utcoffset’]

‘datetime.datetime_CAP’


コメント

タイトルとURLをコピーしました