timedelta 이해


90

아래의 파이썬 코드가 주어지면 거기에서 일어나는 일을 이해하도록 도와주세요.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

그래서 start time와 사이의 차이를 얻 end time습니다. 5 행에서 캐스팅을 통해 지속 시간을 반올림하고 이제 추가 설명은 무엇입니까?

델타가 의미하는 것이 무엇인지 (평균 또는 차이) 알고 있지만, 왜 전달 seconds = uptime해야 timedelta하며 왜 문자열 캐스팅이 그렇게 잘 작동하여 얻을 수 HH:MM:SS있습니까?

답변:


115

timedelta는 다음과 같이 정의되기 때문입니다.

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

모든 인수는 선택 사항이며 기본값은 0입니다.

옵션 인수를 사용하여 "3 일 4 밀리 초"라고 쉽게 말할 수 있습니다.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

그리고 str 캐스팅의 경우 __repr__가독성을 향상시키는 대신 형식이 지정된 멋진 값을 반환합니다 . 문서에서 :

str (t) [D day [s],] [H] H : MM : SS [.UUUUUU] 형식의 문자열을 반환합니다. 여기서 D는 음수 t에 대해 음수입니다. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

체크 아웃 문서 :

http://docs.python.org/library/datetime.html#timedelta-objects


13

초를 전달해야하는 이유 = uptime to timedelta

timedelta 객체는 초, 밀리 초, 일 등을 전달할 수 있으므로 전달할 내용을 지정해야합니다 (이것이 명시 적 키를 사용하는 이유입니다). 로 타입 캐스팅 int은 플로트도 허용 할 수 있으므로 불필요합니다.

그리고 왜 문자열 캐스팅이 그렇게 잘 작동하여 HH : MM : SS를 얻습니까?

형식을 지정하는 것은 형변환이 __str__아니라 개체 의 내부 방법입니다. 실제로 다음과 같이 작성하면 동일한 결과를 얻을 수 있습니다.

print datetime.timedelta(seconds=int(uptime))

1
이에 대해 힌트를 주지만 timedelta는 HH : MM : SS 형식으로 표시하는 것보다 훨씬 더 많은 기능을 수행한다는 점을 명시 적으로 언급 할 가치가 있습니다. timedelta 객체는 두 개의 datetime 객체간에 차이가 필요할 때마다 사용됩니다.
Wilduck 2011-07-19

1
__repr__방법 이 아니라 __str__방법입니다.
utdemir

1
아니 __repr__()timedelta, 그러나 그것의 __str__()방법. 당신을 print부릅니다 __str()__.
bgporter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.