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秒'): 20240907213833秒
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)が出たら、それは間違いです

いいなと思ったら応援しよう!