सेकंड relativedelta के साथ सीधे का उपयोग करना महीनों और वर्षों खानों को भरने नहीं करता है और वहाँ का एक कारण यह है बेशक हम नहीं जानते कि यह 31 दिनों के साथ एक लीप वर्ष या एक महीने है।
तो कुछ इस तरह:
[In]: tdelta = datetime.now() - datetime(1971, 1, 1)
[In]: relativedelta(seconds=tdelta.total_seconds())
[Out]: relativedelta(days=+16958, hours=+13, minutes=+19, seconds=+49)
और दिन के बहुत सारे नहीं महीनों के साथ रिश्तेदार डेल्टा देता है। हालांकि कुछ मामलों में यह ठीक हो सकता है, कुछ में हमें वर्षों और महीनों की आवश्यकता हो सकती है। इसलिए:
def timedelta_to_relativedelta(tdelta):
assert isinstance(tdelta, timedelta)
seconds_in = {
'year' : 365 * 24 * 60 * 60,
'month' : 30 * 24 * 60 * 60,
'day' : 24 * 60 * 60,
'hour' : 60 * 60,
'minute': 60
}
years, rem = divmod(tdelta.total_seconds(), seconds_in['year'])
months, rem = divmod(rem, seconds_in['month'])
days, rem = divmod(rem, seconds_in['day'])
hours, rem = divmod(rem, seconds_in['hour'])
minutes, rem = divmod(rem, seconds_in['minute'])
seconds = rem
return relativedelta(years=years, months=months, days=days, hours=hours, minutes=minutes, seconds=seconds)
यह एक बहुत ही पाइथोनिक समाधान नहीं हो सकता है लेकिन यह काम करता है।
नोट: यह मानता है कि एक वर्ष में 365 दिन (गैर लीप वर्ष छलांग लगते हैं) और महीनों में 30 दिन हैं।
माइक्रोसॉंड कुल_सेकंड में शामिल हैं। –
@LennartRegebro: हाँ, लेकिन relativedelta fractional सेकंड स्वीकार नहीं करता है ('relativedelta (सेकंड = 0.3)' 'relativedelta देता है (सेकंड = + 0)')। साथ ही, जैसा कि प्रलेखन कहता है, माइक्रोसॉन्ड बहुत बड़े अंतराल के लिए सटीक नहीं हो सकता है। –
relativedelta (सेकंड = 0.3) मुझे relativedelta (सेकंड = 0.3) देता है। मैं पाइथन-डेटुटिल 1.5 – falsetru