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
'programing' 카테고리의 다른 글
Javascript로 FB 사진 태그를 프로그래밍 방식으로 해제합니다. (0) | 2023.08.12 |
---|---|
조각 간의 전환을 애니메이션화합니다. (0) | 2023.08.12 |
HTML 링크를 단추처럼 만들려면 어떻게 해야 합니까? (0) | 2023.08.12 |
PowerShell DSC - 구성 매개 변수를 ScriptResources에 전달하는 방법은 무엇입니까? (0) | 2023.08.12 |
MySQL / MariaDB 전체 텍스트 검색 매우 느림 (0) | 2023.08.12 |