web-dev-qa-db-ja.com

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

次のような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時間

40
user1881957

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分、1時間」ではなく「10分、1時間」を取得したい場合は、手動で行う必要があります。

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

これを単一の値に変換してデータベースに保存する場合は、その単一の値を変換してフォーマットし直します。次のようにします。

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)
89
abarnert

_datetime.timedelta_は、日付自体ではなく、2つの日付間のdifferenceに対応します。月や年などのより大きな時間単位はきれいに分解されないため、日、秒、およびマイクロ秒でのみ表されます(30日は1か月ですか、それとも0.9677か月ですか?)。

timedeltaを時間と分に変換する場合は、 total_seconds() メソッドを使用して合計秒数を取得し、いくつかの計算を実行できます。

_x = datetime.timedelta(1, 5, 41038)  # Interval of 1 day and 5.41038 seconds
secs = x.total_seconds()
hours = int(secs / 3600)
minutes = int(secs / 60) % 60
_
16
Adam Rosenfield

_[D day[s], ][H]H:MM:SS[.UUUUUU]_という形式の文字列を出力するだけでよい場合、カスタムヘルパー関数は必要ありません。 timedelta オブジェクトは、これを行うstr()操作をサポートします。 Python 2.6。

_>>> from datetime import timedelta
>>> timedelta(seconds=90136)
datetime.timedelta(1, 3736)
>>> str(timedelta(seconds=90136))
'1 day, 1:02:16'
_
8
wombatonfire

strftime :)を使用するだけです

そんな感じ:

my_date = datetime.datetime(2013, 1, 7, 10, 31, 34, 243366, tzinfo=<UTC>)
print(my_date.strftime("%Y, %d %B"))

質問を編集してtimedeltaの形式にした後、次を使用できます。

def timedelta_Tuple(timedelta_object):
   return timedelta_object.days, timedelta_object.seconds//3600, (timedelta_object.seconds//60)%60
2
Infinity

自分を暗殺するのは良い考えだとは思いません。

きれいな出力だけが必要な場合は、str() functionでstrに変換するか、直接print() it_に変換します。

さらに、時間と分をさらに使用する場合は、datetimeオブジェクトに解析し、datetime.strptime()(およびdatetime.time() mehtodを使用して時間部分を抽出します) :

import datetime

delta = datetime.timedelta(seconds=10000)
time_obj = datetime.datetime.strptime(str(delta),'%H:%M:%S').time()
2
C.K.

Timedeltaオブジェクトを「HH:MM:SS」形式に変換する独自のヘルパー関数を定義しました。時間、日、秒を変更せずに、時間、分、秒のみを変換します。

def format_timedelta(td):
    hours, remainder = divmod(td.total_seconds(), 3600)
    minutes, seconds = divmod(remainder, 60)
    hours, minutes, seconds = int(hours), int(minutes), int(seconds)
    if hours < 10:
        hours = '0%s' % int(hours)
    if minutes < 10:
        minutes = '0%s' % minutes
    if seconds < 10:
        seconds = '0%s' % seconds
    return '%s:%s:%s' % (hours, minutes, seconds)
1
MobilePro.pl

その形式で日付を印刷しますか?これはPython documentation: http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

>>> a = datetime.datetime(2013, 1, 7, 10, 31, 34, 243366)
>>> print a.strftime('%Y %d %B, %M:%S%p')
>>> 2013 07 January, 31:34AM

Timedeltaの場合:

>>> a =  datetime.timedelta(0,5,41038)
>>> print '%s seconds, %s microseconds' % (a.seconds, a.microseconds)

ただし、関連する価値があることを確認してください。上記の場合、時間と分の値はないため、秒から計算する必要があります。

0
jinghli