일로 만 작업 할 때 "datetime.timedelta"와 "dateutil.relativedelta.relativedelta"의 차이점은 무엇입니까?


90

datetime.timedelta(Python의 표준 라이브러리에서) dateutil.relativedelta.relativedelta와 며칠 만 작업 할 때 의 차이점은 무엇입니까 ?

내가 아는 한, timedelta에서는 일 (및 주) 만 지원하고 relativedelta연도, 월, 주 또는 일로 정의 된 기간에 대한 지원을 추가하고 연도, 월 또는 일에 대한 절대 값을 정의합니다. (이 질문의 목적을 위해 시간, 분 또는 초에 대해 걱정할 필요가 없음을 기억하십시오)

나는 단지 함께 일하고 있어요 점을 감안하면 datetime.date객체 만의 차이 무엇, 일의 숫자로 정의 된 기간에 관심 timedelta과는 relativedelta? 차이가 있습니까?

from datetime import date, timedelta
from dateutil.relativedelta import relativedelta

i = -1  # This could have been any integer, positive or negative
someday = date.today()
# Is there any difference between these two lines?
otherday = someday + timedelta(days=i)
otherday = someday + relativedelta(days=i)

3
날짜 사이의 델타에만 관심이 있다면 dateime.timedelta원하는 것을 달성하고 외부 dateutil패키지 에 대한 종속성을 피할 수있는 표준 라이브러리를 사용하십시오 .
Pedro Romano

하나의 추가 종속성을 절약하는 것 외에도 timedelta를 사용하면 날짜 사이의 델타 계산이 relativedelta보다 몇 배 더 빠릅니다. (~ 10 배)
Julien B.

답변:


76

dateutil파이썬 표준 datetime모듈에 대한 확장 패키지 입니다. 말했듯이 하루보다 큰 단위로 표현되는 타임 델타와 같은 추가 기능을 제공합니다.

이것은 내 여자 친구의 생일이 오기 전에 몇 개월을 절약 할 수 있는지, 또는 그 달의 마지막 금요일이 언제인지와 같은 질문을해야 할 때 유용합니다. 이는 월의 길이가 다르거 나 윤년의 추가 일수로 인해 발생하는 복잡한 계산을 숨 깁니다.

귀하의 경우에는 일 수에만 관심이 있습니다. 따라서 패키지 timedelta에 대한 추가 종속성을 피할 수 있으므로 사용 하는 것이 가장 좋습니다 dateutil.


32

A relativedelta에는 a보다 더 많은 매개 변수가 있습니다 timedelta.

Definition:   relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)

한 달의 마지막 금요일 계산과 같은 작업을 수행 할 수 있습니다.

In [14]: import datetime as dt

In [15]: import dateutil.relativedelta as relativedelta

In [16]: today = dt.date.today()

In [17]: rd = relativedelta.relativedelta(day = 31, weekday = relativedelta.FR(-1))

In [18]: today+rd
Out[18]: datetime.date(2012, 9, 28)

1
이것은 "매월 마지막 금요일"과 같은 것에 상대적 델타를 사용하는 새로운 통찰력을 준 환상적인 대답입니다. :) 감사합니다!
PascalVKooten

11

다른 답변에서 강조되지 않은 한 가지 주요 차이점은 각 시차 원시에 대한 단수 및 복수 명사의 존재입니다. 동안 timedelta만 이벤트 명사를 복수 (예를 들면 hours, days)의 상대 시간차를, 나타 내기 위해 relativedelta잘 (예로서 쿠폰 단수 명사 hour, day) 절대 시간 정보를 나타 내기 위해.

이것은 두 클래스의 정의에서 분명합니다.

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

Definition:   relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)

이제 단수형은 정확히 무엇을합니까? 단수 형태는 (A)에 첨가 델타 생성 datetime프리미티브 특정 날짜 / 시간 것을 객체 세트 datetime것과 목적은에서 언급 relativedelta. 다음은 작은 예입니다.

>>> import datetime as dt; from dateutil.relativedelta import *
>>> NOW = dt.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW
datetime.datetime(2018, 11, 17, 9, 6, 31)
>>> NOW + relativedelta(hours=1) #Simply add one hour
datetime.datetime(2018, 11, 17, 10, 6, 31)
>>> NOW + relativedelta(hour=1) #Set the hour to 01:00 am
datetime.datetime(2018, 11, 17, 1, 6, 31)

이로 인해 relativedelta일부 흥미로운 응용 프로그램에 사용될 수 있으며 timedelta. 금방 떠오르는 것은 반올림입니다.

흥미로운 응용 프로그램 : 빠르게 반올림

이제 객체를 가장 가까운 분, 시간, 일 등으로 relativedelta반올림 할 때 어떻게 더 표현력 이 있는지 보여 드리겠습니다 datetime.

가장 가까운 시간으로 반올림 :

다음을 사용하여 반올림하는 것이 얼마나 간단한 지 확인하십시오 relativedelta.

#Using `relativedelta`
NOW + relativedelta(hours=1, minute=0, second=0, microsecond=0)

#Using `timedelta`
dt.combine(NOW.date(),dt.time(NOW.hour,0,0)) + dt.timedelta(0,60*60,0)

다른 더 복잡한 반올림은를 사용하여 쉽게 얻을 수 있습니다 relativedelta. 그러나에서 수행 할 수있는 모든 반올림은 함수 relativedelta및를 사용하여 수행 할 수 있으며 약간 더 복잡한 방식으로 만 수행 할 수 있습니다 .datetimetimedelta

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.