hiro_5656's blog

機械学習やクラウド技術について勉強したことを発信していきます!

【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 を使用します。

docs.python.org

ただし、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 を使用しましょう。

dateutil.readthedocs.io

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
20220315172340

文字列 → 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

あとがき

いかがだったでしょうか。
日付に基づいたデータ、処理を扱う場面はたくさんあると思うので、その際は有効活用していきたいです!