কিভাবে মাসের শেষ দিন পাবেন?


632

প্রদত্ত মাসের শেষ দিনটি সহজেই নির্ধারণ করার জন্য পাইথনের স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করার কোনও উপায় আছে (অর্থাত একটি ফাংশন কল)?

যদি স্ট্যান্ডার্ড লাইব্রেরি এটি সমর্থন করে না, ডেটুটিল প্যাকেজটি কি এটি সমর্থন করে?

উত্তর:


1082

আমি যখন মডিউলটির জন্য ডকুমেন্টেশনগুলিcalendar খুঁজছিলাম তখন আমি এটি লক্ষ্য করিনি , তবে একটি পদ্ধতি যা monthrangeএই তথ্য সরবরাহ করে:

মাসরেঞ্জ (বছর, মাস) মাসের
    প্রথম দিনের সাপ্তাহিক দিন এবং মাসে নির্দিষ্ট মাস এবং মাসের জন্য মাসের দিনগুলি প্রদান করে।

>>> import calendar
>>> calendar.monthrange(2002,1)
(1, 31)
>>> calendar.monthrange(2008,2)
(4, 29)
>>> calendar.monthrange(2100,2)
(0, 28)

তাই:

calendar.monthrange(year, month)[1]

সহজ উপায় মত মনে হচ্ছে।

কেবল পরিষ্কার হতে, monthrangeলিপ বছরগুলিও সমর্থন করে:

>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)

আমার পূর্ববর্তী উত্তরটি এখনও কাজ করে তবে এটি স্পষ্টতই সাবঅপটিমাল।


এটি মূল প্রশ্নের সঠিক উত্তর নয়! যদি মাসের শেষ দিনটি কোনও শনি / রৌদ্র হয়।
মাহদি

8
@ মমদী: এটি সঠিক, দ্বিতীয় সংখ্যাটি হ'ল "মাসের শেষ দিন" == "শেষ দিন", তা কোন ধরণের দিন নির্বিশেষে।
রিকিয়া

এটি বছরের 1800 ফেব্রুয়ারির ভুল দিন ফিরে আসে। আমি এটি পাই না
তরোয়াল 1

8
@ তরোয়াল1 ম, আমি 28উত্তর হিসাবে দেখছি , যা সঠিক, গ্রেগরিয়ান ক্যালেন্ডারের নিয়ম ব্যবহার করে
ব্লেয়ার কনরাড

আমি একমাত্র ভাবতে পারি না monthrangeএকটি বিভ্রান্তিপূর্ণ নাম। আপনি ভাবেন যে এটি ফিরে আসবে (first_day, last_day), না(week_day_of_first_day, number_of_days)
ফ্লিম

146

আপনি যদি calendarমডিউলটি আমদানি করতে না চান তবে একটি সাধারণ দ্বি-পদক্ষেপের ফাংশনটিও হতে পারে:

import datetime

def last_day_of_month(any_day):
    next_month = any_day.replace(day=28) + datetime.timedelta(days=4)  # this will never fail
    return next_month - datetime.timedelta(days=next_month.day)

আউটপুট:

>>> for month in range(1, 13):
...     print last_day_of_month(datetime.date(2012, month, 1))
...
2012-01-31
2012-02-29
2012-03-31
2012-04-30
2012-05-31
2012-06-30
2012-07-31
2012-08-31
2012-09-30
2012-10-31
2012-11-30
2012-12-31

81

সম্পাদনা: ক্লিনার সমাধানের জন্য @ ব্লেয়ার কনরাডের উত্তর দেখুন


>>> import datetime
>>> datetime.date(2000, 2, 1) - datetime.timedelta(days=1)
datetime.date(2000, 1, 31)

43
আমি আসলে এই ক্লিনারটিকে কল করব, এটি ডিসেম্বরে ব্যর্থ হয় today.month + 1 == 13এবং কখন আপনি এটি পান ValueError
ফলমেট

4
আপনি (today.month % 12) + 1যেহেতু 12 % 120
bluemoon

এক 31 শে তারিখে কিছু অদ্ভুত দিবালোক সংরক্ষণের স্যুইচ (আমি মনে করি এটি আজ বিদ্যমান নেই, তবে ভবিষ্যতটি অন্যরকম হতে পারে) কেবলমাত্র 23 ঘন্টা দৈর্ঘ্য সহ সেই মাসের 31 তম রেন্ডার দিতে পারে, যাতে একদিনের বিয়োগ আপনাকে দেয় 30 তারিখে 23:00:00 এ শেষ। এটি অবশ্যই একটি ফ্রিক কেস, তবে এটি দেখায় যে পদ্ধতিটি শক্ত নয়।
Alfe

50

এটি dateutil.relativedelta(পাইপের জন্য পাইগন পাইথন-ডেটটুটিল) দিয়ে আসলেই বেশ সহজ । day=31সর্বদা মাসের শেষ দিন ফিরে আসবে।

উদাহরণ:

from datetime import datetime
from dateutil.relativedelta import relativedelta

date_in_feb = datetime.datetime(2013, 2, 21)
print datetime.datetime(2013, 2, 21) + relativedelta(day=31)  # End-of-month
>>> datetime.datetime(2013, 2, 28, 0, 0)

7
আমি ব্যক্তিগতভাবে
আপেলডেল্টা

আপনি ভুল. datetime(2014, 2, 1) + relativedelta(days=31)দেয় datetime(2014, 3, 4, 0, 0)...
এমানুয়েল

9
আপনি দিনগুলি = দিনের পরিবর্তে = ব্যবহার করেছেন =
ভিন্স স্পাইসর

@ বেনহ এটি আশার উপর ভিত্তি করে (এটি নিশ্চিত হওয়া নিশ্চিত নয়) প্রথমে monthsযুক্ত করা হয়, তার পরে secondsবিয়োগ করা হয়। যেহেতু তারা পাস হয়ে গেছে **kwargsআমি এর উপর নির্ভর করব না এবং পৃথক পৃথক ক্রিয়াকলাপ করব: now + relative(months=+1) + relative(day=1) + relative(days=-1)যা স্পষ্ট নয়।
Alfe

last_day = (<datetime_object> + relativedelta(day=31)).day
ব্যবহারকারী 12345

44

সম্পাদনা: আমার অন্য উত্তর দেখুন । এটির তুলনায় এটির আরও ভাল বাস্তবায়ন রয়েছে, যেহেতু কেউ এখানে "আপনার নিজের" ক্যালকুলেটরটি কীভাবে রোল করতে পারে সেই বিষয়ে আগ্রহী হলেই আমি এখানে ছেড়ে চলেছি।

@ জন মিলিকিন পরের মাসের প্রথম দিন গণনার অতিরিক্ত জটিলতার সাথে একটি ভাল উত্তর দিয়েছেন।

নিম্নলিখিতটি বিশেষভাবে মার্জিত নয়, তবে কোনও নির্দিষ্ট তারিখের মধ্যে যে মাসের শেষ দিনটি থাকে সে মাসের শেষ দিনটি বের করতে আপনি চেষ্টা করতে পারেন:

def last_day_of_month(date):
    if date.month == 12:
        return date.replace(day=31)
    return date.replace(month=date.month+1, day=1) - datetime.timedelta(days=1)

>>> last_day_of_month(datetime.date(2002, 1, 17))
datetime.date(2002, 1, 31)
>>> last_day_of_month(datetime.date(2002, 12, 9))
datetime.date(2002, 12, 31)
>>> last_day_of_month(datetime.date(2008, 2, 14))
datetime.date(2008, 2, 29)

এটি নির্বোধ শোনায় তবে আমি কীভাবে প্রথম মাসের মতো এভাবে পাব।
কিশান

10
সবসময় 1 হয় না?
ব্লেয়ার কনরাড

হ্যাঁ তবে আমি বিভ্রান্ত হয়ে পড়েছিলাম আমি এরকম কিছু দেখছিলাম: শুরু_ তারিখ = তারিখ (তারিখের সময়.নো () বছর, তারিখটাইম.ও () মাস, 1)
কিশান

4
আহ। today = datetime.date.today(); start_date = today.replace(day=1)। আপনি ডেটটাইম কল করা এড়াতে চাইবেন.নু দু'বার, যদি আপনি 31 ডিসেম্বর মধ্যরাতের ঠিক আগে এবং তারপরে মধ্যরাতের ঠিক পরে ফোন করেছিলেন। আপনি 2016-12-01 বা 2017-01-01 এর পরিবর্তে 2016-01-01 পাবেন।
ব্লেয়ার কনরাড

এটি বোঝার জন্য খুব সোজা এবং ডেটটাইম উদাহরণটি দেয় যা অনেক ক্ষেত্রে কার্যকর হতে পারে। আরেকটি সুবিধা হলো এটি কাজ করে যদি ইনপুট dateএকটি দৃষ্টান্ত হল datetime.date, datetime.datetimeএবং pandas.Timestamp
গিলহার্ম সালোম

26

ব্যবহার করে dateutil.relativedeltaআপনি মাসের শেষ তারিখটি পেয়ে যাবেন:

from dateutil.relativedelta import relativedelta
last_date_of_month = datetime(mydate.year, mydate.month, 1) + relativedelta(months=1, days=-1)

ধারণা করা হ'ল মাসের প্রথম দিনটি পেতে এবং relativedelta1 মাস এগিয়ে এবং 1 দিন পিছনে যেতে ব্যবহার করা হয় যাতে আপনি যে মাসে চান তার শেষ দিনটি পাবেন।


13

আর একটি সমাধান হ'ল এটির মতো কিছু করা:

from datetime import datetime

def last_day_of_month(year, month):
    """ Work out the last day of the month """
    last_days = [31, 30, 29, 28, 27]
    for i in last_days:
        try:
            end = datetime(year, month, i)
        except ValueError:
            continue
        else:
            return end.date()
    return None

এবং এই মত ফাংশন ব্যবহার করুন:

>>> 
>>> last_day_of_month(2008, 2)
datetime.date(2008, 2, 29)
>>> last_day_of_month(2009, 2)
datetime.date(2009, 2, 28)
>>> last_day_of_month(2008, 11)
datetime.date(2008, 11, 30)
>>> last_day_of_month(2008, 12)
datetime.date(2008, 12, 31)

5
খুব জটিল, পাইথনের জেনের তৃতীয় নিয়মকে ভেঙে দেয়।
মার্কুজ

11
from datetime import timedelta
(any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)


@ লেয়ার্টস: এটি আমার পক্ষে কাজ করে। কি ঘটেছে যখন আপনি চেষ্টা করেছেন?
কলিন অ্যান্ডারসন

1
এটা কাজ করে। যে কোনও দিন ৩১ শে জানুয়ারী, আমরা দিনটিকে ১ এর সাথে প্রতিস্থাপন করি, সুতরাং 1 জানুয়ারী, 32 দিন যোগ করা হয়, আমরা ২ রা ফেব্রুয়ারী পেয়েছি, আবার = 1 দিনের সাথে প্রতিস্থাপন করব এবং আমরা ফেব্রুয়ারী 1 পেয়েছি এবং একদিন বাদ দিন এবং আমরা 31 জানুয়ারি পেয়েছি। আমি দেখতে পাচ্ছি না সমস্যাটি কী। কোন দিন পাবে?
কলিন অ্যান্ডারসন

9
>>> import datetime
>>> import calendar
>>> date  = datetime.datetime.now()

>>> print date
2015-03-06 01:25:14.939574

>>> print date.replace(day = 1)
2015-03-01 01:25:14.939574

>>> print date.replace(day = calendar.monthrange(date.year, date.month)[1])
2015-03-31 01:25:14.939574

9

আপনি যদি কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করতে ইচ্ছুক হন তবে http://crsmithdev.com/arrow/ দেখুন

আপনি তারপরে মাসের শেষ দিনটি পেতে পারেন:

import arrow
arrow.utcnow().ceil('month').date()

এটি একটি তারিখের অবজেক্ট ফিরিয়ে দেয় যা আপনি তারপরে হেরফের করতে পারেন।


9

মাসের শেষ তারিখটি পেতে আমরা এই জাতীয় কিছু করি:

from datetime import date, timedelta
import calendar
last_day = date.today().replace(day=calendar.monthrange(date.today().year, date.today().month)[1])

এখন আমরা এখানে যা করছি তা ব্যাখ্যা করার জন্য আমরা এটিকে দুটি ভাগে বিভক্ত করব:

প্রথমটি চলতি মাসের দিনগুলির সংখ্যা পাচ্ছে যার জন্য আমরা মাসরেঞ্জ ব্যবহার করি যা ব্লেয়ার কনরাড ইতিমধ্যে তার সমাধান উল্লেখ করেছেন:

calendar.monthrange(date.today().year, date.today().month)[1]

দ্বিতীয়টি সর্বশেষ তারিখটি পেয়ে যা যা আমরা উদাহরণস্বরূপ প্রতিস্থাপনের সাহায্যে করি

>>> date.today()
datetime.date(2017, 1, 3)
>>> date.today().replace(day=31)
datetime.date(2017, 1, 31)

এবং যখন আমরা তাদের উপরে শীর্ষে উল্লিখিত হিসাবে একত্রিত করি তখন আমরা একটি গতিশীল সমাধান পাই।


যদিও এই কোডটি সমস্যা সমাধানে সহায়তা করতে পারে তবে এটি কেন এবং / বা কীভাবে প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করে না । এই অতিরিক্ত প্রসঙ্গ সরবরাহ করা তার দীর্ঘমেয়াদী শিক্ষাগত মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করার জন্য সহ সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ আপনার উত্তর।
টবি স্পিড

এটি সর্বাধিক সোজা মনে হচ্ছে .. আপনি যদি দুটি লাইন দেওয়ার জন্য প্রস্তুত হন তবে আপনি একটি সুন্দর পেতে পারেন date.replace(day=day)যাতে সবাই জানেন যে কী চলছে।
অ্যাডাম স্টারহ

9

পাইথন ৩.7- এ অনির্ধারিত calendar.monthlen(year, month)ফাংশন রয়েছে :

>>> calendar.monthlen(2002, 1)
31
>>> calendar.monthlen(2008, 2)
29
>>> calendar.monthlen(2100, 2)
28

এটি ডকুমেন্টেড calendar.monthrange(year, month)[1]কলের সমতুল্য ।


1
এটি পাইথন ৩.৮.১-তে কাজ করবে বলে মনে হচ্ছে না: অ্যাট্রিবিউটআরার: মডিউল 'ক্যালেন্ডার'-এর কোনও' গুণমান 'নেই
জেপ্পু

1
@ জেপ্পু 1: হ্যাঁ, এটি বিপিও-28292 এ ব্যক্তিগত চিহ্নিত করা হয়েছে - একটি অননুমোদিত কর্মের জন্য প্রত্যাশিত।
jfs

5
import datetime

now = datetime.datetime.now()
start_month = datetime.datetime(now.year, now.month, 1)
date_on_next_month = start_month + datetime.timedelta(35)
start_next_month = datetime.datetime(date_on_next_month.year, date_on_next_month.month, 1)
last_day_month = start_next_month - datetime.timedelta(1)

5

পান্ডা ব্যবহার করুন!

def isMonthEnd(date):
    return date + pd.offsets.MonthEnd(0) == date

isMonthEnd(datetime(1999, 12, 31))
True
isMonthEnd(pd.Timestamp('1999-12-31'))
True
isMonthEnd(pd.Timestamp(1965, 1, 10))
False

1
আপনি pd.series.dt.is_month_end লিঙ্কটি
পাবলো 20

1
পান্ডাস ডেটটাইম অবজেক্টের জন্য এটির একটি নির্দিষ্ট পদ্ধতি রয়েছে:now=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
রোয়াই বাহুমি

3

আমার জন্য এটি সহজতম উপায়:

selected_date = date(some_year, some_month, some_day)

if selected_date.month == 12: # December
     last_day_selected_month = date(selected_date.year, selected_date.month, 31)
else:
     last_day_selected_month = date(selected_date.year, selected_date.month + 1, 1) - timedelta(days=1)

3

সবচেয়ে সহজ উপায় (ক্যালেন্ডার আমদানি না করেই), পরের মাসের প্রথম দিনটি পাওয়া এবং তার থেকে একটি দিন বিয়োগ করা।

import datetime as dt
from dateutil.relativedelta import relativedelta

thisDate = dt.datetime(2017, 11, 17)

last_day_of_the_month = dt.datetime(thisDate.year, (thisDate + relativedelta(months=1)).month, 1) - dt.timedelta(days=1)
print last_day_of_the_month

আউটপুট:

datetime.datetime(2017, 11, 30, 0, 0)

PS:import calendar পদ্ধতির তুলনায় এই কোডটি দ্রুত চলে ; নিচে দেখ:

import datetime as dt
import calendar
from dateutil.relativedelta import relativedelta

someDates = [dt.datetime.today() - dt.timedelta(days=x) for x in range(0, 10000)]

start1 = dt.datetime.now()
for thisDate in someDates:
    lastDay = dt.datetime(thisDate.year, (thisDate + relativedelta(months=1)).month, 1) - dt.timedelta(days=1)

print ('Time Spent= ', dt.datetime.now() - start1)


start2 = dt.datetime.now()
for thisDate in someDates:
    lastDay = dt.datetime(thisDate.year, 
                          thisDate.month, 
                          calendar.monthrange(thisDate.year, thisDate.month)[1])

print ('Time Spent= ', dt.datetime.now() - start2)

আউটপুট:

Time Spent=  0:00:00.097814
Time Spent=  0:00:00.109791

এই কোডটি ধরে নিয়েছে যে আপনি মাসের শেষ দিনের তারিখটি চান (যেমন, কেবল ডিডি অংশ নয়, পুরো ওয়াইওয়াইওয়াইএমএমডিডি তারিখ)


আপনি চান না কেন import calendar?
অ্যাডাম ভেনচুরেলা

1
কারণ এটি দ্রুত। এটি অন্তর্ভুক্ত করার জন্য আমি উপরে আমার উত্তরটি পরিবর্তন করেছি।
বিশাল

@ বিশাল আপনি ধারণাটি সঠিক পেয়েছেন তবে নিম্নলিখিত লাইনটি ছিল না: `` t dt.datetime (thisDate.year, (এই তারিখ + আপেক্ষিকেল্ট (মাস = 1))। মাস, 1) - dt.timedelta (দিন = 1) ` `` বিশেষত যদি মাসটি বছরের শেষে হয়। `` `সর্বশেষ_সামান্য_আম_মর্থ = \ প্রথম_মাস্তে_ প্রথম_মেন্তে + আপেক্ষিক ডেল্টা (মাস = 1) - আপেক্ষিক ডেল্টা (দিন = 1) এর পরিবর্তে` ``
এক্সভিলেটেড

3

এখানে আরও একটি উত্তর। কোন অতিরিক্ত প্যাকেজ প্রয়োজন।

datetime.date(year + int(month/12), month%12+1, 1)-datetime.timedelta(days=1)

পরের মাসের প্রথম দিন পান এবং এটি থেকে একটি দিন বিয়োগ করুন।


2

আপনি নিজেই শেষ তারিখ গণনা করতে পারেন। সাধারণ যুক্তিটি হ'ল পরের মাসের শুরু_ তারিখ থেকে একটি দিন বিয়োগ করা। :)

সুতরাং একটি কাস্টম পদ্ধতি লিখুন,

import datetime

def end_date_of_a_month(date):


    start_date_of_this_month = date.replace(day=1)

    month = start_date_of_this_month.month
    year = start_date_of_this_month.year
    if month == 12:
        month = 1
        year += 1
    else:
        month += 1
    next_month_start_date = start_date_of_this_month.replace(month=month, year=year)

    this_month_end_date = next_month_start_date - datetime.timedelta(days=1)
    return this_month_end_date

কল করা হচ্ছে,

end_date_of_a_month(datetime.datetime.now().date())

এটি এই মাসের শেষের তারিখটি ফিরিয়ে দেবে। এই ফাংশনে কোনও তারিখ পাস করুন। আপনাকে সেই মাসের শেষের তারিখ ফিরিয়ে দেবে।



1

এটি কেবলমাত্র আদর্শ ডেটটাইম লাইব্রেরি ব্যবহার করে আমার পক্ষে সহজ সমাধান:

import datetime

def get_month_end(dt):
    first_of_month = datetime.datetime(dt.year, dt.month, 1)
    next_month_date = first_of_month + datetime.timedelta(days=32)
    new_dt = datetime.datetime(next_month_date.year, next_month_date.month, 1)
    return new_dt - datetime.timedelta(days=1)

0

এটি মূল প্রশ্নের সমাধান করে না, তবে এক মাসের শেষ সপ্তাহের দিনটি পাওয়ার জন্য একটি দুর্দান্ত কৌশলটি হ'ল ব্যবহার করা calendar.monthcalendar, যা সোমবারের সাথে সোমবারের সাথে সর্বশেষ হিসাবে রবিবারের মাধ্যমে প্রথম কলাম হিসাবে সংগঠিত হয় dates

# Some random date.
some_date = datetime.date(2012, 5, 23)

# Get last weekday
last_weekday = np.asarray(calendar.monthcalendar(some_date.year, some_date.month))[:,0:-2].ravel().max()

print last_weekday
31

সমগ্র [0:-2] বিষয়টি হ'ল উইকএন্ডের কলামগুলি শেভ করে এনে ফেলুন। মাসের বাইরে পড়া তারিখগুলি 0 দ্বারা নির্দেশিত হয়, তাই সর্বোচ্চ তাদের কার্যকরভাবে উপেক্ষা করে।

ব্যবহারের numpy.ravelকঠোরভাবে প্রয়োজন নেই, কিন্তু আমি উপর নির্ভর ঘৃণা নিছক কনভেনশন যে numpy.ndarray.maxঅ্যারে চেপ্টা হবে বলেন না যার উপর গণনা করতে অক্ষ।


0
import calendar
from time import gmtime, strftime
calendar.monthrange(int(strftime("%Y", gmtime())), int(strftime("%m", gmtime())))[1]

আউটপুট:

31



এটি চলতি মাস যাই হোক না কেন তার শেষ দিনটি মুদ্রণ করবে। এই উদাহরণে এটি 15 ই মে, 2016 So আপনি যদি প্রতিদিন ক্রোন কাজ চালিয়ে মাসের শেষ দিনটি পরীক্ষা করতে চান তবে দুর্দান্ত।

তাই:

import calendar
from time import gmtime, strftime
lastDay = calendar.monthrange(int(strftime("%Y", gmtime())), int(strftime("%m", gmtime())))[1]
today = strftime("%d", gmtime())
lastDay == today

আউটপুট:

False

যদি না হয় এটি মাসের শেষ দিন।


0

আমি এইভাবে পছন্দ

import datetime
import calendar

date=datetime.datetime.now()
month_end_date=datetime.datetime(date.year,date.month,1) + datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1] - 1)

0

আপনি যদি নিজের নিজস্ব কার্যকারিতা তৈরি করতে চান তবে এটি একটি ভাল সূচনা পয়েন্ট:

def eomday(year, month):
    """returns the number of days in a given month"""
    days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    d = days_per_month[month - 1]
    if month == 2 and (year % 4 == 0 and year % 100 != 0 or year % 400 == 0):
        d = 29
    return d

এর জন্য আপনাকে লিপ বছরের জন্য নিয়মগুলি জানতে হবে:

  • প্রতি চতুর্থ বছর
  • প্রতি 100 বছর বাদে
  • কিন্তু আবার প্রতি 400 বছর পরে

1
অবশ্যই, তবে সিস্টেম লাইব্রেরিতে ইতিমধ্যে এই ডেটা রয়েছে এবং গ্রন্থাগারগুলি আপডেট করার কারণে ডিক্রি দিয়ে নিয়মগুলি পরিবর্তন করা উচিত অন্য কারও সমস্যা।
জেসেন

ওয়েল, সম্ভব, কিন্তু অত্যন্ত অসম্ভাব্য, এবং এমনকি যদি - এটি শুধুমাত্র প্রায় 2000 বছরের মধ্যে আপনি দান্ত দিয়া ফুটা করা হবে ... en.wikipedia.org/wiki/Gregorian_calendar#Accuracy
mathause

এই বিধিগুলি অতীতে 500 বছর ধরে কাজ করে না আমার কোনও আস্থা নেই যে তারা ভবিষ্যতে হাজার বছরের জন্য দাঁড়াবে,
জেসেন

0

আপনি যদি একটি তারিখের সীমার মধ্যে পাস করেন তবে আপনি এটি ব্যবহার করতে পারেন:

def last_day_of_month(any_days):
    res = []
    for any_day in any_days:
        nday = any_day.days_in_month -any_day.day
        res.append(any_day + timedelta(days=nday))
    return res

0

নীচের কোডে 'get_last_day_of_month (dt)' আপনাকে 'YYYY-MM-DD' এর মতো স্ট্রিং ফর্ম্যাটে তারিখ সহ এটিকে দেবে।

import datetime

def DateTime( d ):
    return datetime.datetime.strptime( d, '%Y-%m-%d').date()

def RelativeDate( start, num_days ):
    d = DateTime( start )
    return str( d + datetime.timedelta( days = num_days ) )

def get_first_day_of_month( dt ):
    return dt[:-2] + '01'

def get_last_day_of_month( dt ):
    fd = get_first_day_of_month( dt )
    fd_next_month = get_first_day_of_month( RelativeDate( fd, 31 ) )
    return RelativeDate( fd_next_month, -1 )

0

সবচেয়ে সহজ উপায় হ'ল ব্যবহার datetimeএবং কিছু তারিখ গণিত, উদাহরণস্বরূপ পরের মাসের প্রথম দিন থেকে একটি দিন বিয়োগ করুন:

import datetime

def last_day_of_month(d: datetime.date) -> datetime.date:
    return (
        datetime.date(d.year + d.month//12, d.month % 12 + 1, 1) -
        datetime.timedelta(days=1)
    )

বিকল্পভাবে, আপনি calendar.monthrange()এক মাসে দিনের সংখ্যা পেতে (লিপ বছরগুলিকে বিবেচনায় নিয়ে) এবং সেই অনুযায়ী তারিখটি আপডেট করতে ব্যবহার করতে পারেন :

import calendar, datetime

def last_day_of_month(d: datetime.date) -> datetime.date:
    return d.replace(day=calendar.monthrange(d.year, d.month)[1])

একটি দ্রুত মাপদণ্ড দেখায় যে প্রথম সংস্করণ লক্ষণীয়ভাবে দ্রুততর হয়েছে:

In [14]: today = datetime.date.today()

In [15]: %timeit last_day_of_month_dt(today)
918 ns ± 3.54 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [16]: %timeit last_day_of_month_calendar(today)
1.4 µs ± 17.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

0

এখানে একটি দীর্ঘ (বোঝা সহজ) সংস্করণ তবে লিপ বছরগুলিতে যত্নশীল।

চিয়ার্স, জিকে

def last_day_month(year, month):
    leap_year_flag = 0
    end_dates = {
        1: 31,
        2: 28,
        3: 31,
        4: 30,
        5: 31,
        6: 30,
        7: 31,
        8: 31,
        9: 30,
        10: 31,
        11: 30,
        12: 31
    }

    # Checking for regular leap year    
    if year % 4 == 0:
        leap_year_flag = 1
    else:
        leap_year_flag = 0

    # Checking for century leap year    
    if year % 100 == 0:
        if year % 400 == 0:
            leap_year_flag = 1
        else:
            leap_year_flag = 0
    else:
        pass

    # return end date of the year-month
    if leap_year_flag == 1 and month == 2:
        return 29
    elif leap_year_flag == 1 and month != 2:
        return end_dates[month]
    else:
        return end_dates[month]

আপনি মুছতে পারেন else: passএবং এছাড়াও আপনি if year % 400 == 0: leap_year_flag = 1ছোটখাট পরিবর্তনগুলি থেকে মুক্তি পেতে পারেন
ক্যানব্যাক্স

-1

এখানে একটি সমাধান ভিত্তিক পাইথন ল্যাম্বডাস দেওয়া হয়েছে:

next_month = lambda y, m, d: (y, m + 1, 1) if m + 1 < 13 else ( y+1 , 1, 1)
month_end  = lambda dte: date( *next_month( *dte.timetuple()[:3] ) ) - timedelta(days=1)

next_monthল্যামডা আগামী বছরের ওভার পরবর্তী মাসের প্রথম দিনে এর tuple উপস্থাপনা, এবং রোলস খুঁজে বের করে। month_endল্যামডা একটি তারিখ (রূপান্তরিত dte) একটি tuple চাই, প্রযোজ্য next_monthএবং একটি নতুন তারিখ সৃষ্টি করে। তারপরে "মাসের সমাপ্তি" ঠিক পরের মাসের প্রথম দিনের বিয়োগফল timedelta(days=1)

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