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


回答:


764

あなたはdatetime.timedelta関数を使うことができます:

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'

9
これがIMHOの最良の方法です。timedeltaと任意のdatetimeオブジェクトで算術を使用できるからです。
マシュー・シンケル2009

13
これは複数の日の間機能します: str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
hyprnick

3
str(datetime.timedelta(seconds=round(666666.55)))日を正しくレンダリングします。小数秒を抑制します。
CPBL

1
timedeltaオーバーフローセーフではなく、数学演算を正しく実行できません。たとえばstr(timedelta(hours=8) - timedelta(hours=10))、結果は'-1 day, 22:00:00'整数ベースのソリューションであり、必要な状況にぴったりです'-02:00:00'
cprn 2017

1
+1。この答えは非常に簡単に変更できます。:あなたが印刷フィールドを省略する場合たとえば、この使用 stackoverflow.com/questions/7999935/...
eric_kernfeld

616

divmod()1つの除算のみを実行して商と剰余の両方を生成する関数を使用することにより、2つの数学演算のみで非常に迅速に結果を得ることができます。

m, s = divmod(seconds, 60)
h, m = divmod(m, 60)

次に、文字列フォーマットを使用して、結果を目的の出力に変換します。

print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+

2
関数よりも演算子を好む場合は、モジュロを使用してください。たとえば(分/秒のみ):'%d:%02dmn' % (seconds / 60, seconds % 60)
bufh

18
そして、あなたはそれを何日にも拡張することができます:d, h = divmod(h, 24)
Mark Ransom

14
@MarkRansom:その後数か月m, d = divmod(m, 31)。おっと、できません。さらに悪いことに、うるう秒がゲームに入ると、コードが正しくなくなります。簡単に言えtimedeltaば、カレンダーを使用して混乱させないでください。

4
@Tiboはtimedeltaうるう秒を扱いますか?私はそうは思わない。この単純な計算で十分すぎるアプリケーションはたくさんあります。
マークランサム2015年

1
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))結果は「-1日、22:00:00」なので、うるう秒では機能しますが負の数では機能しません。
cprn 2017

70

簡単な方法で名前を付けることはほとんどできませんが(少なくとも構文を覚えることはできません)、書式設定をより細かく制御できるtime.strftimeを使用できます。

from time import strftime
from time import gmtime

strftime("%H:%M:%S", gmtime(666))
'00:11:06'

strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'

gmtimeは、秒をstrftime()必要な特別なタプル形式に変換するために使用されます。

注:23:59:59以降は切り捨てられます


まあ、その答えは、実際にここで提供される- stackoverflow.com/questions/1384406/...
アナトリーtechtonik

13
残念ながら、この方法は1から日数の測定を開始するため、時間デルタを表すようには設計されていないため、発生するのを待っている事故です。たとえば、 time.strftime('%d %H:%M:%S', time.gmtime(1))=> '1日、0:00:01'とします。
Riaz Rizvi 2016年

41

使用datetime

':0>8'フォーマット:

from datetime import timedelta

"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

':0>8'フォーマットなし:

"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

使用time

from time import gmtime
from time import strftime

# NOTE: The following resets if it goes over 23:59:59!

strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'

strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'

strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'

strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong

1
デルタが低い第2以上であれば、それは失敗します:"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
JFS

1
他のすべての人へ:このwithout ':0>8':例では、先頭に0がありません{:0>8}。ゼロは左側の8つのゼロに埋め込まれています。
TankorSmash 2017

2
Python 3.5.2では、TypeErrorが発生します。time.time()-start変数をフォーマットしています。洞察はありますか?TypeError: non-empty format string passed to object.__format__
medley56 2017

datetime.now()代わりにtime.time()を使用してtimedeltaオブジェクトを生成しようとすると、同じエラーが発生します。
medley56 2017

@ medley56のpython3を使用するときは、使用する必要がありstr()、次のような使用にフォーマットを行っている場合0>8"{:0>8}".format(str(datetime.timedelta(seconds=666777)))。詳細については、この回答を確認してください。
ベリエル2018

22

これは私の簡単なトリックです:

from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'

詳細情報:https : //humanfriendly.readthedocs.io/en/latest/#humanfriendly.format_timespan


私がどれほど長い間この答えを探していたのか、あなたにはわかりません。どうもありがとうございます。私はあなたに+1以上のものを与えることができればいいのに。
Peppa

9

datetime.time値を取得する必要がある場合は、このトリックを使用できます。

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()

あなたは追加できませんtimedeltatime、それにそれを追加することができますdatetime

UPD:同じテクニックのさらに別のバリエーション:

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()

代わりに1、0より大きい任意の数を使用できます。ここでは、コンポーネントがゼロであるオブジェクトをdatetime.fromordinal常に返すという事実を使用します。datetimetime


6

これは私がそれを得た方法です。

def sec2time(sec, n_msec=3):
    ''' Convert seconds to 'D days, HH:MM:SS.FFF' '''
    if hasattr(sec,'__len__'):
        return [sec2time(s) for s in sec]
    m, s = divmod(sec, 60)
    h, m = divmod(m, 60)
    d, h = divmod(h, 24)
    if n_msec > 0:
        pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
    else:
        pattern = r'%02d:%02d:%02d'
    if d == 0:
        return pattern % (h, m, s)
    return ('%d days, ' + pattern) % (d, h, m, s)

いくつかの例:

$ sec2time(10, 3)
Out: '00:00:10.000'

$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'

$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'

$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']

1
上記の答えに対するこれの利点は何ですか? str(datetime.timedelta(seconds=666))
Riaz Rizvi 2016年

@RiazRizviは、マイクロ秒666.0666.1値の一貫した文字列長を提供します。
anatly techtonik 2017年

6

次のセットは私のために働いた。

def sec_to_hours(seconds):
    a=str(seconds//3600)
    b=str((seconds%3600)//60)
    c=str((seconds%3600)%60)
    d=["{} hours {} mins {} seconds".format(a, b, c)]
    return d


print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']

print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']

3

dateutil.relativedeltafloatとして時間、分、秒にもアクセスする必要がある場合に便利です。datetime.timedelta同様のインターフェースは提供していません。

from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
    int(rt.hours), int(rt.minutes), int(rt.seconds)))

プリント

40.0
01:30:40

1
あなたの出力とは異なる出力を取得しているため、タイプミスがあると思います。おそらくのseconds=5440代わりに使用するつもりでしたseconds=5540。でも私はあなたの答えが好きです!
JL

2

3600による秒のフロア分割(//)によって計算された時間(h)(60分/時間* 60秒/分)

残りの秒のフロア除算によって計算された分(m)(%による時間計算からの残り、%)60(60秒/分)

同様に、残りの時間と分の計算による秒(s)。

残りはただの文字列フォーマットです!

def hms(seconds):
    h = seconds // 3600
    m = seconds % 3600 // 60
    s = seconds % 3600 % 60
    return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

print(hms(7500))  # Should print 02h05m00s

このコードはOPの質問に対する解決策を提供するかもしれませんが、それがなぜ/どのように機能するかに関してコンテキストを追加する方が良いです。これは、将来のユーザーが学習し、その知識を自分のコードに適用するのに役立ちます。また、コードが説明されている場合は、賛成票の形でユーザーから肯定的なフィードバックを受ける可能性があります。
borchvm

2
ただ、指摘してくれてありがとう@borchvm!
サム

-2

秒を60で割ると分が得られます

import time
seconds = time.time()
minutes = seconds / 60
print(minutes)

もう一度60で割ると、時間数になります


-3

division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes

PS私のコードは専門外です


2
ねえ、問題は時間でフォーマットを尋ねる:分:秒ではなく、シンプルな部門...
StupidWolf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.