1. ホーム
  2. python

Pythonでdatetime.timedeltaを分や時間に変換するにはどうすればいいですか?

2023-10-21 16:05:37

質問

このようにstart_dateが表示されるのですが。

from django.utils.timezone import utc
import datetime

start_date = datetime.datetime.utcnow().replace(tzinfo=utc)
end_date = datetime.datetime.utcnow().replace(tzinfo=utc)
duration = end_date - start_date

こんな感じで出力されます。

datetime.timedelta(0, 5, 41038)

これを以下のように通常の時間に変換するにはどうしたらよいでしょうか。

10分、1時間は次のようになります。

どのように解決するのですか?

に対する組み込みのフォーマッタはありません。 timedelta オブジェクトのための組み込みのフォーマッタはありませんが、自分でそれを行うのはとても簡単です。

days, seconds = duration.days, duration.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

または、同等に、Python 2.7+または3.2+の場合。

seconds = duration.total_seconds()
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

これで、好きなように印刷できるようになりました。

'{} minutes, {} hours'.format(minutes, hours)

例えば

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = days * 24 + seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return hours, minutes, seconds
td = datetime.timedelta(2, 7743, 12345)
hours, minutes, seconds = convert_timedelta(td)
print '{} minutes, {} hours'.format(minutes, hours)

これで印刷されます。

9 minutes, 50 hours

もし、"10 minutes, 1 hours"の代わりに"10 minutes, 1 hour"を取得したい場合は、これも手動で行う必要があります。

print '{} minute{}, {} hour{}'.format(minutes, 's' if minutes != 1 else '',
                                      hours, 's' if minutes != 1 else '')

あるいは english_plural 関数で 's' のビットを代わりに行ってくれます。

あなたのコメントから、あなたは実際に日を分けておきたいようですね。それならなおさら簡単です。

def convert_timedelta(duration):
    days, seconds = duration.days, duration.seconds
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = (seconds % 60)
    return days, hours, minutes, seconds

これを1つの値に変換してデータベースに格納し、その1つの値を再び変換して整形したい場合は、次のようにします。

def dhms_to_seconds(days, hours, minutes, seconds):
    return (((days * 24) + hours) * 60 + minutes) * 60 + seconds

def seconds_to_dhms(seconds):
    days = seconds // (3600 * 24)
    hours = (seconds // 3600) % 24
    minutes = (seconds // 60) % 60
    seconds = seconds % 60
    return days, hours, minutes, seconds

で、まとめると。

def store_timedelta_in_database(thingy, duration):
    seconds = dhms_to_seconds(*convert_timedelta(duration))
    db.execute('INSERT INTO foo (thingy, duration) VALUES (?, ?)',
               thingy, seconds)
    db.commit()

def print_timedelta_from_database(thingy):
    cur = db.execute('SELECT duration FROM foo WHERE thingy = ?', thingy)
    seconds = int(cur.fetchone()[0])
    days, hours, minutes, seconds = seconds_to_dhms(seconds)
    print '{} took {} minutes, {} hours, {} days'.format(thingy, minutes, hours, days)