【Python】Python ~ 基本編 / 日付・日時 ~

■ はじめに

Python の 日付・日時 ・時間をメモ

英語だけど、以下がわかりやすい

https://www.programiz.com/python-programming/datetime

目次

【1】日時・日付・時間の取得
【2】相互変換
 1)文字列⇔日時の変換
 2)timestamp ⇔ datetimeの変換
 3)unix time (int) への変換
【3】日時・日付の計算
 1)3日前後を計算 - datetime.timedelta
 2)1ヶ月前後を計算 - dateutil.relativedelta

 => 応用編は、以下の関連記事を参照のこと。

Python ~ 基本編 / 日付・日時あれこれ ~
https://dk521123.hatenablog.com/entry/2022/02/01/000000

【1】日時・日付・時間の取得

サンプル

import datetime

def main():
    # 日時(2019-10-14 12:25:14.122283)
    now_object = datetime.datetime.now()
    print(now_object)
    # 日付(2019-10-14)
    today_object = datetime.date.today()
    print(today_object) 

    # 時間(00:00:00)
    current_time_object = datetime.time()
    print(current_time_object)    

    # 日時(2019-10-09 11:23:54)
    datetime_object = datetime.datetime(2019, 10, 9, 11, 23, 54, 0)
    print(datetime_object)

    print("year:", datetime_object.year)
    print("month:", datetime_object.month)
    print("day:", datetime_object.day)
    print("hour:", datetime_object.hour)
    print("minute:", datetime_object.minute)
    print("second:", datetime_object.second)
    print("microsecond:", datetime_object.microsecond)

    # 日付(2019-09-29)
    date_object = datetime.date(2019, 9, 29)  
    print(date_object)  

    # 時間(08:19:34.000011)
    current_time_object = datetime.time(8, 19, 34, 11)
    print(current_time_object)    

if __name__ == '__main__':
    main()

【2】相互変換

1)文字列⇔日時の変換

* 文字列⇔日時の変換は、 strptime() を使用

サンプル

import datetime

def main():
    # 文字列⇒日時
    input_datetime = '2019-10-29 13:59:49'
    output_datetime = datetime.datetime.strptime(
        input_datetime, '%Y-%m-%d %H:%M:%S')
    print(output_datetime)

    # 日時⇒文字列
    now_datetime = datetime.datetime.now()
    result = now_datetime.strftime('%Y/%m/%d %H:%M:%S')
    print(result)

    today = now_datetime.strftime('%Y%m%d')
    print(result) # 20230419


if __name__ == '__main__':
    main()

参考文献
https://qiita.com/shibainurou/items/0b0f8b0233c45fc163cd

2)timestamp ⇔ datetimeの変換

* [datetime => timestamp]
 -> datetime.datetime.timestamp() を使う

* [timestamp => datetime]
 -> datetime.datetime.fromtimestamp() を使う

サンプル

import datetime

if __name__ == '__main__':
  # datetime
  now_datetime = datetime.datetime.now()
  print(now_datetime)

  # datetime => timestamp
  now_timestamp = now_datetime.timestamp()
  print(now_timestamp)

  # timestamp => datetime
  now_datetime2 = datetime.datetime.fromtimestamp(now_timestamp)
  print(now_datetime2)

出力結果

2019-12-03 22:55:07.938806
1575381307.938806
2019-12-03 22:55:07.938806

3)unix time (int) への変換

import datetime

if __name__ == '__main__':
  # timestamp
  now_timestamp = datetime.datetime.now().timestamp()
  print(now_timestamp)
  print(datetime.datetime.fromtimestamp(now_timestamp))

  # timestamp => unix time
  now_unix_time = int(now_timestamp)
  print(now_unix_time)

  now_datetime = datetime.datetime.fromtimestamp(now_unix_time)
  print(now_datetime)

出力結果

1575381832.867667
2019-12-03 23:03:52.867667
1575381832 <- 小数点が削除
2019-12-03 23:03:52 <- ミリ秒が削られた

【3】日時・日付の計算

1)3日前後を計算 - datetime.timedelta

from datetime import datetime, timedelta

# 現在日時を取得
current_datetime = datetime.now()
# 2021-05-25 16:40:13.449495
print(current_datetime)

# 3日後は、「+」する
three_days_after = current_datetime + timedelta(days=3)
# 3日前は、「-」する
three_days_ago = current_datetime - timedelta(days=3)

# three_days_after = 2021-05-28
print(f"three_days_after = {datetime.strftime(three_days_after, '%Y-%m-%d')}")
# three_days_ago = 2021-05-22
print(f"three_days_ago = {datetime.strftime(three_days_ago, '%Y-%m-%d')}")

API仕様 - datetime.timedelta
https://docs.python.org/ja/3/library/datetime.html#timedelta-objects

より抜粋

# month と year がない...
class datetime.timedelta(
  days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

2)1ヶ月前後を計算 - dateutil.relativedelta

from datetime import datetime
from dateutil.relativedelta import relativedelta

# 現在日時を取得
current_datetime = datetime.now()
# 2021-05-25 16:40:13.449495
print(current_datetime)

# 1ヶ月後は、「+」する
one_month_after = current_datetime + relativedelta(months=1)
# 1ヶ月前は、「-」する
one_month_ago = current_datetime - relativedelta(months=1)

# one_month_after = 2021-06-25
print(f"one_month_after = {datetime.strftime(one_month_after, '%Y-%m-%d')}")
# one_month_ago = 2021-04-25
print(f"one_month_ago = {datetime.strftime(one_month_ago, '%Y-%m-%d')}")

API仕様 - dateutil.relativedelta
https://dateutil.readthedocs.io/en/stable/
補足:AWS Glue 上での使用について

ジョブタイプ「Python shell」で使用できるか試したら、
エラーなく、使用できた。
(ジョブタイプ「Spark」などの他のJobについては未確認)

詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2019/11/17/231505

参考文献
https://qiita.com/dkugi/items/8c32cc481b365c277ec2

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / 日付・日時あれこれ ~
https://dk521123.hatenablog.com/entry/2022/02/01/000000
PythonPostgreSQL を使う ~ PyGreSQL ~
https://dk521123.hatenablog.com/entry/2019/11/27/000316