দুটি প্রদত্ত তারিখের মধ্যে কত দিন গণনা করা যায়?


505

আমার যদি দুটি তারিখ থাকে (প্রাক্তন '8/18/2008'এবং '9/26/2008'), এই দুটি তারিখের মধ্যে দিনের সংখ্যা পাওয়ার সর্বোত্তম উপায় কী?

উত্তর:


799

আপনার যদি দুটি তারিখের অবজেক্ট থাকে তবে আপনি কেবল সেগুলি বিয়োগ করতে পারেন, যা কোনও timedeltaবস্তুর গণনা করে ।

from datetime import date

d0 = date(2008, 8, 18)
d1 = date(2008, 9, 26)
delta = d1 - d0
print(delta.days)

দস্তাবেজের সম্পর্কিত বিভাগ: https://docs.python.org/library/datetime.html

এই উদাহরণটি অন্য একটি উদাহরণের জন্য দেখুন ।


2
এখানে দুর্দান্ত উত্তর। যেহেতু লোকেরা অনেক পান্ডাস ডেটা ফ্রেম ব্যবহার হতে পারে, চিন্তার কিভাবে থেকে রূপান্তর করতে এর লিঙ্কে চেক করতে সহায়ক হতে পারে np.datetime64থেকে python datetime stackoverflow.com/questions/52982056/...
Pramit

সুন্দর জিনিস হ'ল এই সমাধানটি লিপ বছরের জন্য সঠিক ডেল্টাও দেয়।
লাসমা

154

ডেটটাইমের শক্তি ব্যবহার:

from datetime import datetime
date_format = "%m/%d/%Y"
a = datetime.strptime('8/18/2008', date_format)
b = datetime.strptime('9/26/2008', date_format)
delta = b - a
print delta.days # that's it

4
প্রকৃতপক্ষে, তারিখের ক্লাসটি ডেটটাইমের চেয়ে এই ক্ষেত্রে আরও উপযুক্ত হবে appropriate
জেরেমি ক্যান্ট্রেল

10
@ জেরেমি ক্যান্ট্রেল এবং এখনও, আট বছর পরেও, dateএর নিজস্ব সমতুল্যের অভাব রয়েছে strptime()
জ্যাব

কেন দরকার ARG? প্রথম আরগের তারিখের সাথে পরিষ্কার হওয়া উচিত যার ফর্ম্যাট রয়েছে। strptimeformat
টিমো

36

ক্রিসমাস পর্যন্ত দিন:

>>> import datetime
>>> today = datetime.date.today()
>>> someday = datetime.date(2008, 12, 25)
>>> diff = someday - today
>>> diff.days
86

আরও গাণিতিক এখানে


16

আপনি ডেটটাইম মডিউলটি চান।

>>> from datetime import datetime, timedelta 
>>> datetime(2008,08,18) - datetime(2008,09,26) 
datetime.timedelta(4) 

আরেকটি উদাহরণ:

>>> import datetime 
>>> today = datetime.date.today() 
>>> print(today)
2008-09-01 
>>> last_year = datetime.date(2007, 9, 1) 
>>> print(today - last_year)
366 days, 0:00:00 

যেমন এখানে নির্দেশিত


1
0:00:00 ভাগ না করে আমি কীভাবে এটি পাব?
ভিকি বি

@ ভিকিবিdelta = today - last_year print(delta.days)
ডিবিকিউ

8
from datetime import datetime
start_date = datetime.strptime('8/18/2008', "%m/%d/%Y")
end_date = datetime.strptime('9/26/2008', "%m/%d/%Y")
print abs((end_date-start_date).days)

2
4 বছর আগে দেওয়া উত্তরের তুলনায় এটি নতুন কিছু যুক্ত করে না। -1।
মার্ক অ্যামেরি

ব্যবহারের জন্য +1 abs(), যা দরকারী যখন তুলনা করা তারিখগুলি আগে অজানা থাকে এবং এটি আপনার আগ্রহী datetime.strptime(date, date)তারতম্য। abs()সমস্ত ইনপুট পরম করে তোলে (অর্থাত্ ইতিবাচক)।
সুস্বাদু


6

শুধু খাঁটি কোড ব্যবহার না করে:

#Calculate the Days between Two Date

daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def isLeapYear(year):

    # Pseudo code for this algorithm is found at
    # http://en.wikipedia.org/wiki/Leap_year#Algorithm
    ## if (year is not divisible by 4) then (it is a common Year)
    #else if (year is not divisable by 100) then (ut us a leap year)
    #else if (year is not disible by 400) then (it is a common year)
    #else(it is aleap year)
    return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

def Count_Days(year1, month1, day1):
    if month1 ==2:
        if isLeapYear(year1):
            if day1 < daysOfMonths[month1-1]+1:
                return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                    return year1, month1 +1 , 1
        else: 
            if day1 < daysOfMonths[month1-1]:
                return year1, month1, day1+1
            else:
                if month1 ==12:
                    return year1+1,1,1
                else:
                    return year1, month1 +1 , 1
    else:
        if day1 < daysOfMonths[month1-1]:
             return year1, month1, day1+1
        else:
            if month1 ==12:
                return year1+1,1,1
            else:
                    return year1, month1 +1 , 1


def daysBetweenDates(y1, m1, d1, y2, m2, d2,end_day):

    if y1 > y2:
        m1,m2 = m2,m1
        y1,y2 = y2,y1
        d1,d2 = d2,d1
    days=0
    while(not(m1==m2 and y1==y2 and d1==d2)):
        y1,m1,d1 = Count_Days(y1,m1,d1)
        days+=1
    if end_day:
        days+=1
    return days


# Test Case

def test():
    test_cases = [((2012,1,1,2012,2,28,False), 58), 
                  ((2012,1,1,2012,3,1,False), 60),
                  ((2011,6,30,2012,6,30,False), 366),
                  ((2011,1,1,2012,8,8,False), 585 ),
                  ((1994,5,15,2019,8,31,False), 9239),
                  ((1999,3,24,2018,2,4,False), 6892),
                  ((1999,6,24,2018,8,4,False),6981),
                  ((1995,5,24,2018,12,15,False),8606),
                  ((1994,8,24,2019,12,15,True),9245),
                  ((2019,12,15,1994,8,24,True),9245),
                  ((2019,5,15,1994,10,24,True),8970),
                  ((1994,11,24,2019,8,15,True),9031)]

    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print "Test with data:", args, "failed"
        else:
            print "Test case passed!"

test()

3

সবাই তারিখটি ব্যবহার করে দুর্দান্ত উত্তর দিয়েছে, পান্ডাস ব্যবহার করে এর উত্তর দেওয়ার চেষ্টা করি

dt = pd.to_datetime('2008/08/18', format='%Y/%m/%d')
dt1 = pd.to_datetime('2008/09/26', format='%Y/%m/%d')

(dt1-dt).days

এই উত্তর দেবে। ইনপুটগুলির মধ্যে একটি হ'ল ডেটা ফ্রেম কলাম। কেবল ব্যবহার dt.days স্থানে দিন

(dt1-dt).dt.days

2

একটি datetime.toordinal()পদ্ধতি রয়েছে যা এখনও উল্লেখ করা হয়নি:

import datetime
print(datetime.date(2008,9,26).toordinal() - datetime.date(2008,8,18).toordinal())  # 39

https://docs.python.org/3/library/datetime.html#datetime.date.toordinal

date.toordinal ()

তারিখ, যেখানে 1 বছরের জানুয়ারি 1 কোন পূরণবাচক 1. হয়েছে প্রলেপ্টিক গ্রেগরিয়ান পূরণবাচক ফিরুন dateবস্তুর , date.fromordinal(d.toordinal()) == d

দিনের পার্থক্য গণনা করার জন্য উপযুক্ত বলে মনে হচ্ছে, যতটা পঠনযোগ্য নয় timedelta.days


1
এই পদ্ধতিটি জিতেছে এমন ক্ষেত্রেও রয়েছে। উদাহরণস্বরূপ, 2019-07-09 23:50 এবং 2019-07-10 00:10 এর মধ্যে আসল পার্থক্য বিশ মিনিট। (d1 - d0).daysআয় 0, d1.toordinal() - d0.toordinal()আয় 1। আপনার আসল ইউসকেসে আপনার কী প্রয়োজন তা নির্ভর করে।
পিটার.স্লিজিক

এই পদ্ধতির আসলে তারিখের সময় এবং তারিখ তুলনা করতে পারেন। উদাহরণস্বরূপ 2020-04-17 == 2020-04017 00:00:00
হ্যারি ডুং

2

তারিখ এবং সময় গণনা করার জন্য, বিভিন্ন বিকল্প রয়েছে তবে আমি সহজ উপায়ে লিখব:

from datetime import timedelta, datetime, date
import dateutil.relativedelta

# current time
date_and_time = datetime.datetime.now()
date_only = date.today()
time_only = datetime.datetime.now().time()

# calculate date and time
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)

# calculate dates: years (-/+)
result = date_only - dateutil.relativedelta.relativedelta(years=10)

# months
result = date_only - dateutil.relativedelta.relativedelta(months=10)

# days
result = date_only - dateutil.relativedelta.relativedelta(days=10)

# calculate time 
result = date_and_time - datetime.timedelta(hours=26, minutes=25, seconds=10)
result.time()

আশা করি এটা সাহায্য করবে


1

from datetime import date
def d(s):
  [month, day, year] = map(int, s.split('/'))
  return date(year, month, day)
def days(start, end):
  return (d(end) - d(start)).days
print days('8/18/2008', '9/26/2008')

এটি অবশ্যই ধরে নিয়েছে যে আপনি ইতিমধ্যে যাচাই করেছেন যে আপনার তারিখগুলি ফর্ম্যাটে রয়েছে r'\d+/\d+/\d+'


1
এটি 8 বছর আগে দেওয়া উত্তরের তুলনায় নতুন কিছু যুক্ত করে না। -1।
মার্ক অ্যামেরি

1
মূল পার্থক্য হ'ল অন্যান্য উত্তরগুলির বেশিরভাগ উত্তরটি এমনকি অ্যাকাউন্টে স্ট্রিং হিসাবে তার ওপেনের তারিখগুলি থাকার জন্যও জবাব দেয় না। এবং যারা এর জন্য অ্যাকাউন্ট করেছেন তারা কঠোরভাবে প্রয়োজনের চেয়ে বেশি জটিল ফর্ম্যাটর ব্যবহার করেছেন। সুতরাং, মূল পার্থক্য হয় map(int, s.split('/'))। একেবারে গ্রাউন্ডব্রেকিং নয়, তবে আবার এই প্রশ্নটি বেশ বোকা মৌলিক। আমার উত্তরটি কেবল বিড়ালের চামড়ার অন্য উপায় দেখায়।
পার্থিয়ান শট

তারিখগুলি সঠিক ফর্ম্যাটে রয়েছে তা যাচাই করার বিষয়টিও উল্লেখ করেছে এবং একটি প্রথম-আনুমানিক বৈধতা পুনর্নির্মাণ দিয়েছে। যা অন্যরা করেনি।
পার্থিয়ান শট

1

এই সমস্যাটি নিয়ে যাওয়ার জন্য এখানে তিনটি উপায় রয়েছে:

from datetime import datetime

Now = datetime.now()
StartDate = datetime.strptime(str(Now.year) +'-01-01', '%Y-%m-%d')
NumberOfDays = (Now - StartDate)

print(NumberOfDays.days)                     # Starts at 0
print(datetime.now().timetuple().tm_yday)    # Starts at 1
print(Now.strftime('%j'))                    # Starts at 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.