HOWTO · Python

Python에서 datetime 빼기

Python에서 두 datetime 값의 차이를 구하고 경과 시간을 초, 분, 시간으로 변환하는 방법을 알아봅니다.

이 페이지의 내용

later - earlier처럼 한 datetime 객체에서 다른 객체를 빼면 됩니다. Python은 두 값 사이에 실제로 경과한 시간을 나타내는 timedelta를 반환합니다. 이 시간 차이는 일과 초 단위로 확인하거나 전체 초, 분, 시간으로 변환할 수 있습니다.

datetime 모듈을 사용해 Python에서 날짜와 시간 빼기

datetime 모듈은 날짜와 시간을 다루는 객체를 제공합니다. 각 값을 만들 때 연도, 월, 일을 지정하고, 시, 분, 초, 마이크로초는 필요에 따라 지정할 수 있습니다. 아래 예제는 실행 시점에 따라 결과가 달라지지 않도록 고정된 값을 사용합니다.

from datetime import datetime

earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier

print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5

결과는 2시간 30분을 나타내는 timedelta입니다. days, seconds, microseconds 속성은 정규화된 시간 차이를 각 구성 요소로 보여 줍니다. 전체 경과 시간을 초 단위로 구하려면 datetime이 아니라 timedelta의 total_seconds()를 호출합니다. 반환된 값에 60을 나누면 분, 3,600을 나누면 시간이 됩니다. 시간 차이가 온전한 분이나 시간이 아니면 나눗셈 결과에 소수 부분이 남습니다.

days는 온전한 날짜 수를, seconds는 정규화된 시간 차이에서 남은 초를 나타냅니다. 어느 속성도 전체 초 수를 대신하지는 않습니다. 예를 들어 하루보다 긴 시간 차이에서도 seconds는 86,400보다 작을 수 있으므로, 전체 기간의 초 수가 필요하면 total_seconds()를 사용하세요. 마이크로초가 포함된 경우 반환값은 실수가 될 수 있습니다.

정수 단위가 필요하다면 먼저 반올림 규칙을 정하세요. int()로 변환하면 가장 가까운 값으로 반올림하지 않고 0을 향해 소수 부분을 버립니다. 또한 1년은 고정된 시간 길이가 아니므로 365일을 1년으로 계산하는 것은 근사치일 뿐입니다. 윤년과 달력상의 월 경계에 따라 달력 계산 결과가 달라집니다. ‘1년 후’처럼 날짜를 기준으로 한 계산이 필요하다면 경과 초가 아니라 달력에 따른 기준을 명시적으로 사용하세요.

두 값의 시간대를 일관되게 비교할 수 있을 때 뺄셈을 사용하세요. 시간대 정보가 없는 naive 값은 다른 naive 값과 뺄 수 있습니다. 시간대 정보가 있는 aware 값으로 시간대 전환을 포함한 경과 시간을 구하려면 두 값을 astimezone(timezone.utc)로 UTC에 맞춘 뒤 계산하세요. naive 값과 aware 값을 함께 빼면 TypeError가 발생합니다. 뺄셈 전에 시간대 정보를 적절히 지정하거나 변환해야 합니다.