केवल दिनों के साथ काम करने पर "datetime.timedelta" और "dateutil.relativedelta.relativedelta" में क्या अंतर है?


90

datetime.timedelta(पायथन के मानक पुस्तकालय से) और 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पैकेज पर निर्भरता से बचेंगे।
पेड्रो रोमानो

यह कहने योग्य है कि एक अतिरिक्त निर्भरता को बचाने के लिए, तिथियों के बीच के दिनों में डेल्टास की गणना कई बार तेजी से समयबद्धता की तुलना में रिलेडेटिवेल्टा के साथ होती है। (~ 10 बार)
जूलियन बी।

जवाबों:


76

dateutilअजगर मानक datetimeमॉड्यूल के लिए एक विस्तार पैकेज है । जैसा कि आप कहते हैं, यह अतिरिक्त कार्यक्षमता प्रदान करता है, जैसे कि टाइमटेलेट्स जो एक दिन से बड़ी इकाइयों में व्यक्त किए जाते हैं।

यह उपयोगी है अगर आपको ऐसे प्रश्न पूछने हैं जैसे कि मैं अपनी प्रेमिका के जन्मदिन पर आने से पहले कितने महीने बचा सकता हूं, या महीने में आखिरी शुक्रवार क्या है? यह जटिल गणना को छुपाता है जो महीनों की अलग-अलग लंबाई या लीप वर्षों में अतिरिक्त दिनों के कारण होता है।

आपके मामले में, आप केवल दिनों की संख्या में रुचि रखते हैं। तो आप सबसे अच्छा उपयोग timedeltaकरेंगे क्योंकि यह dateutilपैकेज पर एक अतिरिक्त निर्भरता से बचा जाता है ।


32

एक 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)

1
यह एक शानदार जवाब है जिसने "महीने के अंतिम शुक्रवार" जैसी चीजों के लिए एक relativedelta का उपयोग करने की नई अंतर्दृष्टि दी :) धन्यवाद!
पास्कलवीकूटेन

10

अन्य उत्तरों में हाइलाइट किया गया एक प्रमुख अंतर प्रत्येक समय अंतर आदिम के लिए एकवचन और बहुवचन संज्ञाओं की उपस्थिति है। जबकि timedeltaकेवल प्रस्तावों संज्ञाओं बहुवचन (जैसे hours, days) सापेक्ष समय अंतर, निरूपित करने के लिए relativedeltaएकवचन संज्ञाओं प्रदान करता है और साथ ही (जैसे hour, day) पूर्ण समय की जानकारी निरूपित करने के लिए।

यह 2 वर्गों की परिभाषा से स्पष्ट है:

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वस्तु को निकटतम मिनट, घंटा, दिन इत्यादि के चक्कर लगाते समय और अधिक अभिव्यक्त कैसे किया जाता है।

निकटतम घंटे के लिए राउंडिंग:

ध्यान दें कि इसका उपयोग करके राउंड-ऑफ करना कितना सीधा है 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, केवल थोड़ा अधिक जटिल तरीके से।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.