Python Cookbook [Converting Days to Seconds, and Other Basic Time Conversions : 日付の秒数への変換、及び、他の基本的な日時変換] 投稿一覧へ戻る
Published 2020年4月14日21:14 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
# Problem:
# 日付を秒数、分数、時間に変換するような単純な日時変換を行いたい。
# Solution:
# 異なる時間ユニット間の変換や計算には datetime モジュールを利用します。
# 例えば、2つの時間の差などの時間間の計算を実行したければ timedeltaオブジェクトを使用します。
# 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 歳
# 日付を秒数、分数、時間に変換するような単純な日時変換を行いたい。
# 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
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 歳
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -