প্রদত্ত মাসের শেষ দিনটি সহজেই নির্ধারণ করার জন্য পাইথনের স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করার কোনও উপায় আছে (অর্থাত একটি ফাংশন কল)?
যদি স্ট্যান্ডার্ড লাইব্রেরি এটি সমর্থন করে না, ডেটুটিল প্যাকেজটি কি এটি সমর্থন করে?
প্রদত্ত মাসের শেষ দিনটি সহজেই নির্ধারণ করার জন্য পাইথনের স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করার কোনও উপায় আছে (অর্থাত একটি ফাংশন কল)?
যদি স্ট্যান্ডার্ড লাইব্রেরি এটি সমর্থন করে না, ডেটুটিল প্যাকেজটি কি এটি সমর্থন করে?
উত্তর:
আমি যখন মডিউলটির জন্য ডকুমেন্টেশনগুলি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)
আমার পূর্ববর্তী উত্তরটি এখনও কাজ করে তবে এটি স্পষ্টতই সাবঅপটিমাল।
28
উত্তর হিসাবে দেখছি , যা সঠিক, গ্রেগরিয়ান ক্যালেন্ডারের নিয়ম ব্যবহার করে
monthrange
একটি বিভ্রান্তিপূর্ণ নাম। আপনি ভাবেন যে এটি ফিরে আসবে (first_day, last_day)
, না(week_day_of_first_day, number_of_days)
আপনি যদি 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
সম্পাদনা: ক্লিনার সমাধানের জন্য @ ব্লেয়ার কনরাডের উত্তর দেখুন
>>> import datetime
>>> datetime.date(2000, 2, 1) - datetime.timedelta(days=1)
datetime.date(2000, 1, 31)
today.month + 1 == 13
এবং কখন আপনি এটি পান ValueError
।
(today.month % 12) + 1
যেহেতু 12 % 12
0
এটি 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)
datetime(2014, 2, 1) + relativedelta(days=31)
দেয় datetime(2014, 3, 4, 0, 0)
...
months
যুক্ত করা হয়, তার পরে seconds
বিয়োগ করা হয়। যেহেতু তারা পাস হয়ে গেছে **kwargs
আমি এর উপর নির্ভর করব না এবং পৃথক পৃথক ক্রিয়াকলাপ করব: now + relative(months=+1) + relative(day=1) + relative(days=-1)
যা স্পষ্ট নয়।
last_day = (<datetime_object> + relativedelta(day=31)).day
সম্পাদনা: আমার অন্য উত্তর দেখুন । এটির তুলনায় এটির আরও ভাল বাস্তবায়ন রয়েছে, যেহেতু কেউ এখানে "আপনার নিজের" ক্যালকুলেটরটি কীভাবে রোল করতে পারে সেই বিষয়ে আগ্রহী হলেই আমি এখানে ছেড়ে চলেছি।
@ জন মিলিকিন পরের মাসের প্রথম দিন গণনার অতিরিক্ত জটিলতার সাথে একটি ভাল উত্তর দিয়েছেন।
নিম্নলিখিতটি বিশেষভাবে মার্জিত নয়, তবে কোনও নির্দিষ্ট তারিখের মধ্যে যে মাসের শেষ দিনটি থাকে সে মাসের শেষ দিনটি বের করতে আপনি চেষ্টা করতে পারেন:
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)
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
।
ব্যবহার করে dateutil.relativedelta
আপনি মাসের শেষ তারিখটি পেয়ে যাবেন:
from dateutil.relativedelta import relativedelta
last_date_of_month = datetime(mydate.year, mydate.month, 1) + relativedelta(months=1, days=-1)
ধারণা করা হ'ল মাসের প্রথম দিনটি পেতে এবং relativedelta
1 মাস এগিয়ে এবং 1 দিন পিছনে যেতে ব্যবহার করা হয় যাতে আপনি যে মাসে চান তার শেষ দিনটি পাবেন।
আর একটি সমাধান হ'ল এটির মতো কিছু করা:
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)
from datetime import timedelta
(any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
আপনি যদি কোনও বাহ্যিক গ্রন্থাগার ব্যবহার করতে ইচ্ছুক হন তবে http://crsmithdev.com/arrow/ দেখুন
আপনি তারপরে মাসের শেষ দিনটি পেতে পারেন:
import arrow
arrow.utcnow().ceil('month').date()
এটি একটি তারিখের অবজেক্ট ফিরিয়ে দেয় যা আপনি তারপরে হেরফের করতে পারেন।
মাসের শেষ তারিখটি পেতে আমরা এই জাতীয় কিছু করি:
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)
যাতে সবাই জানেন যে কী চলছে।
পাইথন ৩.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]
কলের সমতুল্য ।
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)
পান্ডা ব্যবহার করুন!
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
now=datetime.datetime.now(); pd_now = pd.to_datetime(now); print(pd_now.days_in_month)
আমার জন্য এটি সহজতম উপায়:
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)
সবচেয়ে সহজ উপায় (ক্যালেন্ডার আমদানি না করেই), পরের মাসের প্রথম দিনটি পাওয়া এবং তার থেকে একটি দিন বিয়োগ করা।
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
?
এখানে আরও একটি উত্তর। কোন অতিরিক্ত প্যাকেজ প্রয়োজন।
datetime.date(year + int(month/12), month%12+1, 1)-datetime.timedelta(days=1)
পরের মাসের প্রথম দিন পান এবং এটি থেকে একটি দিন বিয়োগ করুন।
আপনি নিজেই শেষ তারিখ গণনা করতে পারেন। সাধারণ যুক্তিটি হ'ল পরের মাসের শুরু_ তারিখ থেকে একটি দিন বিয়োগ করা। :)
সুতরাং একটি কাস্টম পদ্ধতি লিখুন,
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())
এটি এই মাসের শেষের তারিখটি ফিরিয়ে দেবে। এই ফাংশনে কোনও তারিখ পাস করুন। আপনাকে সেই মাসের শেষের তারিখ ফিরিয়ে দেবে।
আপনি আপেলডেলটা https://dateutil.readthedocs.io/en/stable/relativedelta.html
ব্যবহার করতে পারেন
month_end = <your datetime value within the month> + relativedelta(day=31)
যা আপনাকে শেষ দিনটি দেবে।
এটি কেবলমাত্র আদর্শ ডেটটাইম লাইব্রেরি ব্যবহার করে আমার পক্ষে সহজ সমাধান:
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)
এটি মূল প্রশ্নের সমাধান করে না, তবে এক মাসের শেষ সপ্তাহের দিনটি পাওয়ার জন্য একটি দুর্দান্ত কৌশলটি হ'ল ব্যবহার করা 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
অ্যারে চেপ্টা হবে বলেন না যার উপর গণনা করতে অক্ষ।
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
যদি না হয় এটি মাসের শেষ দিন।
আপনি যদি নিজের নিজস্ব কার্যকারিতা তৈরি করতে চান তবে এটি একটি ভাল সূচনা পয়েন্ট:
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
এর জন্য আপনাকে লিপ বছরের জন্য নিয়মগুলি জানতে হবে:
নীচের কোডে '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 )
সবচেয়ে সহজ উপায় হ'ল ব্যবহার 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)
এখানে একটি দীর্ঘ (বোঝা সহজ) সংস্করণ তবে লিপ বছরগুলিতে যত্নশীল।
চিয়ার্স, জিকে
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
ছোটখাট পরিবর্তনগুলি থেকে মুক্তি পেতে পারেন
এখানে একটি সমাধান ভিত্তিক পাইথন ল্যাম্বডাস দেওয়া হয়েছে:
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)
।