cover_python_cookbook

Python Cookbook [Converting Days to Seconds, and Other Basic Time Conversions : 日付の秒数への変換、及び、他の基本的な日時変換] 投稿一覧へ戻る

Tags: Python , Cookbook , relativedelta , datetime , timedelta , dateutil

Published 2020年4月14日21:14 by T.Tsuyoshi

# Problem:
# 日付を秒数、分数、時間に変換するような単純な日時変換を行いたい。

# Solution:
# 異なる時間ユニット間の変換や計算には datetime モジュールを利用します。
# 例えば、2つの時間の差などの時間間の計算を実行したければ timedeltaオブジェクトを使用します。

from datetime import timedelta

a = timedelta(days = 2, hours = 6)
b = timedelta(hours = 4.5)
c = a + b

c.days # → 2
c.seconds # → 37800
c.seconds / 3600 # → 10.5
c.total_seconds() / 3600 # → 58.5


# timedelta オブジェクトは内部的には days (日数)、seconds (秒数)、microseconds (マイクロ秒数) だけを保持しています。
# ですから上の例では、a と b の hours は内部的には seconds として保持されていますから、6 + 4.5 = 10.5(時間) * 3600(秒/1時間) となって c.seconds は 37800 となっています。
# また、timedelta.total_seconds は、保持している days、seconds、microseconds 全てを秒数に変換し合算した結果を返します。

# 特定の日付や時刻を表現したい場合は datetime インスタンスを作成します。標準的な演算を実行することが可能です。

from datetime import datetime

a = datetime(2020, 4, 14)
print(a + timedelta(days = 10)) # → (10日後は) 2020-04-24 00:00:00
b = datetime(2020, 5, 25)
d = b - a
d.days # → (d は timedelta オブジェクトです) 41

now = datetime.today()
print(now) # → 2020-04-14 19:59:35.507001
print(now + timedelta(minutes = 10)) # → 2020-04-14 20:09:35.507001

# datetime オブジェクトは「うるう年」に対応しています。
a = datetime(2020, 3, 1)
b = datetime(2020, 2, 28)
(a - b).days # → 2 (今年はオリンピックイヤー、だった・・・)

c = datetime(2019, 3, 1)
d = datetime(2019, 2, 28)
(c - d).days # → 1

# 日時変換に関するほとんどの問題は datetime モジュールでカバーできるかもしれませんが、より複雑なオペレーション、例えばタイムゾーンを考慮するとか、2つの時刻間経過を他の単位(year、month 等) でも取得したい、などには dateutil ライブラリ ( http://pypi.python.org/pypi/python-dateutil ) が非常に便利です。

a = datetime(2020, 4, 14)
a + timedelta(months = 1) # → TypeError: 'months' is an invalid keyword argument

from dateutil.relativedelta import relativedelta
a + relativedelta(months = +1) # → datetime.datetime(2020, 5, 14, 0, 0)

nana_birth = datetime(1994, 5, 25)

a - nana_birth # → datetime.timedelta(days=9456)

b = relativedelta(a, nana_birth)
b # → relativedelta(years=+25, months=+10, days=+20)
print('Nana は現在', b.years, '歳') # → Nana は現在 25 歳

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)