Python datetime 試験対策 徹底的に調べ尽くす
まずオブジェクトの構造について調べる
import datetime
now = datetime.datetime.now()
print(now)
print(f"print(type(now)): {type(now)}")
print("now.year: ", now.year)
print("now.month: ", now.month)
print("now.day: ", now.day)
print("now.hour: ", now.hour)
print("now.minute: ", now.minute)
print("now.second: ", now.second)
print("now.microsecond: ", now.microsecond)
print("now.tzinfo: ", now.tzinfo)
2024-09-07 21:38:33.285305
print(type(now)): <class 'datetime.datetime'>
now.year: 2024
now.month: 9
now.day: 7
now.hour: 21
now.minute: 38
now.second: 33
now.microsecond: 285305
now.tzinfo: None
可視化してみる
datetimeオブジェクトはdate, timeオブジェクトを持っている それぞれのオブジェクトの構造についても見てみましょう datetimeオブジェクトからdateオブジェクトとtimeオブジェクトを取り出してみる
date_part = now.date()
time_part = now.time()
print("date_part (now.date()):", date_part)
print(f"type(date_part): {type(date_part)}")
type(date_part): <class 'datetime.date'>
time_part (now.time()): 21:38:33.285305
print("time_part (now.time()):", time_part)
print(f"type(time_part): {type(time_part)}")
type(time_part): <class 'datetime.time'>
date_part.year: 2024
dateオブジェクトの年、月、日を確認する
print("date_part.year: ", date_part.year)
print("date_part.month: ", date_part.month)
print("date_part.day: ", date_part.day)
timeオブジェクトの時、分、秒、マイクロ秒を確認する
print("time_part.hour: ", time_part.hour)
print("time_part.minute: ", time_part.minute)
print("time_part.second: ", time_part.second)
print("time_part.microsecond: ", time_part.microsecond)
date_part.year: 2024
date_part.month: 9
date_part.day: 7
time_part.hour: 21
time_part.minute: 38
time_part.second: 33
time_part.microsecond: 285305
次に、datetimeオブジェクトを文字列に変換する方法を見てみましょう strftimeメソッドを使います このメソッドは、指定したフォーマットで文字列に変換します フォーマットは、%記号とアルファベットの組み合わせで指定します 例えば、%Yは年、%mは月、%dは日、%Hは時、%Mは分、%Sは秒、%fはマイクロ秒を表します 他にも、曜日や時差など、様々な情報を取り出すことができます 以下は、いくつかの例です
print("now.strftime('%Y-%m-%d %H:%M:%S'):", now.strftime('%Y-%m-%d %H:%M:%S'))
print("now.strftime('%Y年%m月%d日 %H時%M分%S秒'):", now.strftime('%Y年%m月%d日 %H時%M分%S秒'))
print("now.strftime('%Y-%m-%d %H:%M:%S.%f'):", now.strftime('%Y-%m-%d %H:%M:%S.%f'))
now.strftime('%Y-%m-%d %H:%M:%S'): 2024-09-07 21:38:33
now.strftime('%Y年%m月%d日 %H時%M分%S秒'): 2024年09月07日 21時38分33秒
now.strftime('%Y-%m-%d %H:%M:%S.%f'): 2024-09-07 21:38:33.285305
また、文字列からdatetimeオブジェクトを作ることもできます strptimeメソッドを使います このメソッドは、指定したフォーマットで文字列を解釈してdatetimeオブジェクトを作ります 以下は、いくつかの例です
str1 = "2021-01-01 12:34:56"
str2 = "2021年01月01日 12時34分56秒"
str3 = "2021-01-01 12:34:56.789"
dt1 = datetime.datetime.strptime(str1, '%Y-%m-%d %H:%M:%S')
dt2 = datetime.datetime.strptime(str2, '%Y年%m月%d日 %H時%M分%S秒')
dt3 = datetime.datetime.strptime(str3, '%Y-%m-%d %H:%M:%S.%f')
print("dt1:", dt1)
print("dt2:", dt2)
print("dt3:", dt3)
dt1: 2021-01-01 12:34:56
dt2: 2021-01-01 12:34:56
dt3: 2021-01-01 12:34:56.789000
また、datetimeオブジェクト同士の演算も可能です 例えば、2つの日時の差を計算することができます その結果は、timedeltaオブジェクトとして返ります
dt4 = datetime.datetime.strptime("2021-01-01 12:34:56", '%Y-%m-%d %H:%M:%S')
dt5 = datetime.datetime.strptime("2021-01-02 12:34:56", '%Y-%m-%d %H:%M:%S')
diff = dt5 - dt4
print("diff:", diff)
print(f"type(diff): {type(diff)}")
print("diff.days:", diff.days)
print("diff.seconds:", diff.seconds)
print("diff.microseconds:", diff.microseconds)
diff: 1 day, 0:00:00
type(diff): <class 'datetime.timedelta'>
diff.days: 1
diff.seconds: 0
diff.microseconds: 0
timedeltaオブジェクトは、日数、秒数、マイクロ秒数を持っています また、total_secondsメソッドを使うことで、秒数に換算することもできます 以下は、その例です
print("diff.total_seconds():", diff.total_seconds())
diff.total_seconds(): 86400.0
また、datetimeオブジェクトにtimedeltaオブジェクトを足したり引いたりすることもできます 以下は、その例です
dt6 = dt4 + diff
dt7 = dt5 - diff
print("dt6:", dt6)
print("dt7:", dt7)
# datetimeオブジェクトを使うと1週間後や1ヶ月後などの日時を計算することもできます
# そのためには、timedeltaオブジェクトを使います
# 以下は、その例です
now = datetime.datetime.now()
dt8 = now + datetime.timedelta(weeks=1)
dt9 = now + datetime.timedelta(days=30)
dt10 = now + datetime.timedelta(hours=24)
dt11 = now + datetime.timedelta(minutes=60)
dt12 = now + datetime.timedelta(seconds=3600)
print("dt8:", dt8)
print("dt9:", dt9)
print("dt10:", dt10)
print("dt11:", dt11)
print("dt12:", dt12)
# dt6: 2021-01-02 12:34:56
# dt7: 2021-01-01 12:34:56
# dt8: 2024-09-14 21:38:33.289274
# dt9: 2024-10-07 21:38:33.289274
# dt10: 2024-09-08 21:38:33.289274
# dt11: 2024-09-07 22:38:33.289274
# dt12: 2024-09-07 22:38:33.289274
今から過去の日時を計算することもできます その場合は、timedeltaオブジェクトにマイナスをつけます 以下は、その例です 今の日時から1週間前、1ヶ月前、1日前、1時間前、1分前、1秒前の日時を計算しています
dt8 = now + datetime.timedelta(weeks=-1)
dt9 = now + datetime.timedelta(days=-30)
dt10 = now + datetime.timedelta(hours=-24)
dt11 = now + datetime.timedelta(minutes=-60)
dt12 = now + datetime.timedelta(seconds=-3600)
また、datetimeオブジェクト同士の比較も可能です 以下は、その例です
dt13 = datetime.datetime.strptime("2021-01-01 12:34:56", '%Y-%m-%d %H:%M:%S')
dt14 = datetime.datetime.strptime("2021-01-01 12:34:56", '%Y-%m-%d %H:%M:%S')
dt15 = datetime.datetime.strptime("2021-01-02 12:34:56", '%Y-%m-%d %H:%M:%S')
print("dt13 == dt14:", dt13 == dt14)
print("dt13 == dt15:", dt13 == dt15)
print("dt13 < dt15:", dt13 < dt15)
print("dt13 > dt15:", dt13 > dt15)
dt13 == dt14: True
dt13 == dt15: False
dt13 < dt15: True
dt13 > dt15: False
また、datetimeオブジェクトには、曜日や時差などの情報も含まれています 以下は、その例です
print("now.weekday():", now.weekday())
print("now.isoweekday():", now.isoweekday())
print("now.isocalendar():", now.isocalendar())
print("now.isoformat():", now.isoformat())
print("now.ctime():", now.ctime())
now.weekday(): 5
now.isoweekday(): 6
now.isocalendar(): datetime.IsoCalendarDate(year=2024, week=36, weekday=6)
now.isoformat(): 2024-09-07T21:35:33.827072
now.ctime(): Sat Sep 7 21:35:33 2024
ctimeは、Unix時間を文字列に変換する関数です Unix時間とは、1970年1月1日0時0分0秒からの経過秒数のことです この時間は、協定世界時(UTC)で表されます また、この時間は、整数値で表されます 以下は、その例です
print("now.timestamp():", now.timestamp())
now.timestamp(): 1700007733.827072
isoの意味は、International Organization for Standardizationです これは、国際標準化機構のことです
豆知識
weekday()とisoweekday()の違い weekday()は月曜日を0, isoweekday()は月曜日を1として、曜日を返します
print("now.weekday():", now.weekday())
print("now.isoweekday():", now.isoweekday())
now.weekday(): 5
now.isoweekday(): 6
datetimeオブジェクトにある strftime, strptime, isoformat, fromisoformat 上記の違いを理解する それぞれのメソッドの違いを理解する まずstrftimeメソッドは、datetimeオブジェクトを文字列に変換するメソッドです
print("now.strftime('%Y-%m-%d %H:%M:%S'):", now.strftime('%Y-%m-%d %H:%M:%S'))
now.strftime('%Y-%m-%d %H:%M:%S'): 2024-09-07 21:50:35
次にstrptimeメソッドは、文字列をdatetimeオブジェクトに変換するメソッドです
str1 = "2021-01-01 12:34:56"
dt1 = datetime.datetime.strptime(str1, '%Y-%m-%d %H:%M:%S')
print("dt1:", dt1)
dt1: 2021-01-01 12:34:56
覚え方
strftimeは、str(文字列) + f(format)で、文字列をフォーマットする strptimeは、str(文字列) + p(parse)で、文字列を解釈する
isoformatメソッドは、datetimeオブジェクトをISO 8601形式の文字列に変換するメソッドです
print("now.isoformat():", now.isoformat())
now.isoformat(): 2024-09-07T21:50:35.656818
fromisoformatメソッドは、ISO 8601形式の文字列をdatetimeオブジェクトに変換するメソッドです
dt2 = datetime.datetime.fromisoformat("2021-01-01T12:34:56")
print("dt2:", dt2)
dt2: 2021-01-01 12:34:56
試験に出る!
timedeltaオブジェクトでは「1ヶ月後の日付を取得する」ことができません なぜなら、1ヶ月は28日、30日、31日など、月によって異なるからです もし試験でひっかけ問題としてdatetime.timedelta(month=1)が出たら、それは間違いです