programing

datetime.timedelta와 dateutil.relativelta.relativelta는 일 단위로만 작업할 때 무엇이 다릅니까?

oldcodes 2023. 8. 12. 10:40
반응형

datetime.timedelta와 dateutil.relativelta.relativelta는 일 단위로만 작업할 때 무엇이 다릅니까?

(파이썬의 표준 라이브러리와) 일 단위로만 작업할 때의 차이점은 무엇입니까?

제가 알기로는timedelta몇 일(및 몇 주)만 지원하는 반면relativedelta에는 연도, 월, 주 또는 일 단위로 정의된 기간에 대한 지원과 연도, 월 또는 일에 대한 절대값 정의가 추가되어 있습니다.(이 질문의 목적을 위해 몇 시간, 몇 분 또는 몇 초를 걱정할 필요가 없습니다.)

개체로만 작업하고 일 수에 따라 정의된 기간에만 관심이 있다는 점을 고려할 때, 어떤 차이가 있습니까?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)

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

여자친구의 생일이 다가오기 전에 몇 개월을 저축할 수 있는지, 한 달 중 마지막 금요일이 언제인지 등과 같은 질문을 해야 할 경우 유용합니다.이렇게 하면 월의 길이가 다르거나 윤년의 추가 날짜로 인해 발생하는 복잡한 계산이 숨겨집니다.

이 경우 일 수에만 관심이 있습니다.그래서 당신은 사용하는 것이 좋습니다.timedelta이것은 에 대한 추가적인 의존을 피하기 때문에.dateutil꾸러미

A relativedelta보다 더 많은 매개 변수가 있습니다.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)

다른 답변에서 강조되지 않은 한 가지 주요 차이점은 각 시간 차이 원시에 대한 단수 및 복수 명사의 존재입니다.하는 동안에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)

자, 단수형은 정확히 무엇을 하는 것일까요?단수 형태는 델타를 생성하는데, 이 델타는 다음에 추가될 때 생성됩니다.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가장 가까운 1분, 1시간, 1일 등에 이의를 제기합니다.

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

다음을 사용하여 라운드오프하는 것이 얼마나 쉬운지 주목하십시오.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를 사용하여 수행할 수도 있습니다.datetime 및 기능timedelta조금 더 복잡한 방법으로만.

@이 언급했듯이, @julien 이,,timedelta보다 몇 배 빠른 속도입니다.relativedelta다음은 일을 사용한 간단한 데모입니다.

In [1]: from datetime import date, timedelta
   ...: from dateutil.relativedelta import *
   ...: import timeit

In [2]: def td():
   ...:     return date.today() + timedelta(days=7)
   ...:

In [3]: def rd():
   ...:     return date.today() + relativedelta(days=7)
   ...:

In [4]: timeit.timeit('td()', 'from __main__ import td', number=1000)
Out[4]: 0.0019557802006602287

In [5]: timeit.timeit('rd()', 'from __main__ import rd', number=1000)
Out[5]: 0.014670956879854202

성능이 중요한 경우relativedelta다음을 사용하여 작업을 수행할 수 없는 경우를 제외하고는 피해야 합니다.timedelta(예: 주/월/년 델타 추가).

언급URL : https://stackoverflow.com/questions/12433233/what-is-the-difference-between-datetime-timedelta-and-dateutil-relativedelta

반응형