초를시, 분, 초로 어떻게 변환합니까?


답변:


763

당신은 datetime.timedelta기능 을 사용할 수 있습니다 :

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

9
타임 델타 및 날짜 / 시간 객체에서 산술을 사용할 수 있으므로 IMHO가 가장 좋은 방법입니다.
Matthew Schinckel

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 September

1
+1. 이 답변은 매우 쉽게 수정할 수 있습니다. 예를 들어, 인쇄 할 때 필드를 생략하려면 다음을 사용하십시오. stackoverflow.com/questions/7999935/…
eric_kernfeld

615

divmod()몫과 나머지를 모두 생성하기 위해 단일 나누기 만하 는 함수 를 사용하면 두 가지 수학 연산만으로도 결과를 매우 빠르게 얻을 수 있습니다.

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윤초를 처리합니까? 나는 의심하지 않는다. 이 간단한 수학만으로도 충분한 응용 프로그램이 있습니다.
Mark Ransom

1
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))결과는 '-1 ​​day, 22:00:00'이므로 윤초와 함께 작동하지만 음수로는 작동하지 않으면 idk입니다.
cprn

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 day, 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
델타가 1 초 미만이면 실패합니다."{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
jfs

1
다른 모든 사람에게 :이 without ':0>8':예제 {:0>8}에는 왼쪽에있는 0 개의 선행 0 패드 가 없습니다 .
TankorSmash

2
Python 3.5.2에서는 TypeError가 발생합니다. time.time()-start변수를 포맷하고 있습니다. 통찰력이 있습니까? TypeError: non-empty format string passed to object.__format__
medley56

timedelta 객체를 생성 하는 datetime.now()대신 사용하려고했는데 time.time()동일한 오류가 발생합니다.
medley56

@ medley56 Python3을 사용할 str()0>8다음 과 같은 형식 을 사용 하려는 경우 사용해야합니다 "{:0>8}".format(str(datetime.timedelta(seconds=666777))). 자세한 내용은 이 답변 을 확인하십시오 .
Berriel


9

datetime.time가치 를 얻으려면 다음과 같은 트릭을 사용할 수 있습니다.

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

에 추가 timedelta할 수는 없지만에 추가 할 time수 있습니다 datetime.

UPD : 동일한 기술의 또 다른 변형 :

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

대신 10보다 큰 숫자를 사용할 수 있습니다. 여기서는 datetime.fromordinal항상 구성 요소가 0 인 datetime객체를 반환 한다는 사실을 사용합니다 time.


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값에 대해 일관된 문자열 길이를 제공 합니다.
anatoly techtonik

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.relativedelta수레, 시간, 분 및 초에 액세스 해야하는 경우 편리합니다. 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 (60 분 / 시간 * 60 초 / 분)으로 초 단위로 나눈 값으로 계산 된 시간 (h)

남은 초 (시간 계산의 나머지, %)를 60 (60 초 / 분)으로 나눈 층으로 나눈 분 (m)

마찬가지로 나머지 시간 및 분 계산에 의한 초 (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

추신 : 내 코드는 전문가가 아닙니다


2
야, 문제는 시간의 형식을 요청 : 분 : 초,하지 간단한 부문 ..
StupidWolf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.