কেবলমাত্র দিনের সাথে কাজ করার সময় "ডেটটাইম.টিমেডেলটা" এবং "ডেটুটি.এল্লেটিভডেল্টা.রেলেটিভডেল্টা" এর মধ্যে পার্থক্য কী?


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)

4
আপনি যদি কেবল তারিখের মধ্যে দিনগুলিতে ডেল্টাসে আগ্রহী হন তবে কেবলমাত্র স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করুন dateime.timedeltaযা আপনি যা চান তা অর্জন করবে এবং বাহ্যিক dateutilপ্যাকেজের উপর নির্ভরতা এড়াবে ।
পেড্রো রোমানো

এটি বলার অপেক্ষা রাখে না যে একটি অতিরিক্ত নির্ভরতা সঞ্চয় করার শীর্ষে, তারিখগুলির মধ্যে কয়েক দিনের মধ্যে ডেল্টা গণনা করা আপেক্ষিক ডেল্টারের তুলনায় টাইমডেল্টার সাথে একাধিকবার দ্রুত faster (~ 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)

4
এটি একটি দুর্দান্ত উত্তর যা "মাসের শেষ শুক্রবার" এর মতো জিনিসের জন্য একটি আপেক্ষিক ডেল্টা ব্যবহারের নতুন অন্তর্দৃষ্টি দিয়েছে :) ধন্যবাদ!
পাসক্যালভিকুটেন

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বস্তুর নিকটতম মিনিট, ঘন্টা, দিন ইত্যাদির জন্য গোল করার সময় আরও কীভাবে ভাব প্রকাশ করা যায় how

নিকটতম ঘন্টা পর্যন্ত গোলাকার:

রাউন্ড অফ ব্যবহার করে এটি কতটা সহজ তা লক্ষ্য করুন 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কেবল কিছুটা আরও বিভ্রান্তিকর উপায়ে করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.