【Python】datetime モジュールで日付や時間を扱えるようになろう!
まえがき
先日Pythonで日付ごとのデータを扱いたい場面があり、その際に学習したことをブログで共有したいと思います!
Pythonで日付や時間を扱う!
Pythonで日付を扱うにはdatetime型を使いましょう。
from datetime import datetime, timedelta
年月日を指定することでdatetime型の変数を作成できます。
today = datetime(2022, 3, 15) today ## Out ## ---- datetime.datetime(2022, 3, 15, 0, 0)
年月日より小さい単位も指定可能です。 時分秒も指定してみましょう。
day1 = datetime(2022, 3, 15, 17, 23, 40) day1 ## Out ## --- datetime.datetime(2022, 3, 15, 17, 23, 40)
print(day1) ## Out ## --- 2022-03-15 17:23:40
datetime型で足し算をする!
datetime型を使うメリットの1つとして日時の足し引き算といった計算が簡単にできることがあります。
日単位以下の差分計算
日時の差分を表現するには timedelta を使用します。
ただし、timedelta はdays以下の差分しか表現できません。(weeksも使えます)
# 足し算(days以下) print('当日:', day1) print('1日後:', day1+ timedelta(days=1)) print('1時間後:', day1+ timedelta(hours=1)) print('1分後:', day1+ timedelta(minutes=1)) print('1秒後:', day1+ timedelta(seconds=1)) ## Out ## --- 当日: 2022-03-15 17:23:40 1日後: 2022-03-16 17:23:40 1時間後: 2022-03-15 18:23:40 1分後: 2022-03-15 17:24:40 1秒後: 2022-03-15 17:23:41
weeksも使えます。
# weeksでも指定可能 print('当日:', day1) print('1週間:', day1+ timedelta(weeks=1)) ## Out ## --- 当日: 2022-03-15 17:23:40 1週間: 2022-03-22 17:23:40
月単位以上の差分計算
月単位以上の差分を表現するには relativedelta を使用しましょう。
from dateutil.relativedelta import relativedelta
# 足し算(months以上) print('当日:', day1) print('1ヶ月後:', day1+ relativedelta(months=1)) print('1年後:', day1+ relativedelta(years=1)) ## Out ## --- 当日: 2022-03-15 17:23:40 1ヶ月後: 2022-04-15 17:23:40 1年後: 2023-03-15 17:23:40
実はrelativedeltaは日単位以下も扱えます。
# 足し算(days以下) print('当日:', day1) print('1日後:', day1+ relativedelta(days=1)) print('1時間後:', day1+ relativedelta(hours=1)) print('1分後:', day1+ relativedelta(minutes=1)) print('1秒後:', day1+ relativedelta(seconds=1)) ## Out ## --- 当日: 2022-03-15 17:23:40 1日後: 2022-03-16 17:23:40 1時間後: 2022-03-15 18:23:40 1分後: 2022-03-15 17:24:40 1秒後: 2022-03-15 17:23:41
なお、複数の引数で差分を表現することもできます。
# 複合足し算 print('当日:', day1) print('1日後+1時間後:', day1+ relativedelta(days=1, hours=1)) ## Out ## --- 当日: 2022-03-15 17:23:40 1日後+1時間後: 2022-03-16 18:23:40
datetime型の不等号表現
datetime型は不等号で日時の前後関係が表現できます。
これを利用することで、ある日からある日までのデータを繰り返し処理するといったことができます。
サンプルコードを以下に示します。
start_time = datetime(2022, 3, 25) end_time = datetime(2022, 4, 2) ob_time = start_time while (ob_time <= end_time): print(ob_time) ob_time = ob_time + relativedelta(days=1) ## Out ## --- 2022-03-25 00:00:00 2022-03-26 00:00:00 2022-03-27 00:00:00 2022-03-28 00:00:00 2022-03-29 00:00:00 2022-03-30 00:00:00 2022-03-31 00:00:00 2022-04-01 00:00:00 2022-04-02 00:00:00
datetime型 ←→ 文字列
datetime型 → 文字列
datetime型を所望の文字列に変換するには strftime を使用します。
書式を指定することでその書式の文字列として出力されます。
import datetime
# datetime型 → 文字列 # datetime型 → 文字列 day1 = datetime.datetime(2022, 3, 15, 17, 23, 40) date_str = day1.strftime('%Y/%m/%d %H:%M:%S') date_str2 = day1.strftime('%Y年%m月%d日 %H時%M分%S秒') print(date_str) print(date_str2) ## Out ## --- 2022/03/15 17:23:40 2022年03月15日 17時23分40秒
文字列 → datetime型
特定の文字列をdatetime型にする場合には、strptime を使用します。
文字列の書式をきちんと指定すれば、それをもとにdatetime型として読み取ってくれます。
# 文字列 → datetime型 date_str = '2022/3/15 17:23-40' day2 = datetime.datetime.strptime(date_str, '%Y/%m/%d %H:%M-%S') print(day2) ## Out ## --- 2022-03-15 17:23:40
あとがき
いかがだったでしょうか。
日付に基づいたデータ、処理を扱う場面はたくさんあると思うので、その際は有効活用していきたいです!