python - पाइथन में महीने का अंतिम दिन प्राप्त करें




date (16)

क्या किसी दिए गए महीने के अंतिम दिन आसानी से निर्धारित करने के लिए पायथन की मानक लाइब्रेरी का उपयोग करने का कोई तरीका है (यानी एक फ़ंक्शन कॉल)?

यदि मानक लाइब्रेरी इसका समर्थन नहीं करती है, तो डेटपुट पैकेज इसका समर्थन करता है?


Relativedelta का उपयोग करके आपको इस तरह की महीने की आखिरी तारीख मिल जाएगी:

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

विचार है कि महीने का मुट्ठी दिन प्राप्त करें और 1 महीने पहले और 1 दिन पहले जाने के लिए relativedelta का उपयोग करें ताकि आपको उस महीने का आखिरी दिन मिल सके जो आप चाहते थे।


आप स्वयं की समाप्ति तिथि की गणना कर सकते हैं। सरल तर्क अगले महीने के start_date से एक दिन घटाना है। :)

तो एक कस्टम विधि लिखें,

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())

यह इस महीने की समाप्ति तिथि वापस कर देगा। इस समारोह में किसी भी तारीख को पास करें। आपको उस महीने की समाप्ति तिथि देता है।


पांडा का प्रयोग करें!

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

महीने की आखिरी तारीख पाने के लिए हम ऐसा कुछ करते हैं:

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

अब यह समझाने के लिए कि हम यहां क्या कर रहे हैं हम इसे दो भागों में तोड़ देंगे:

सबसे पहले वर्तमान महीने के दिनों की संख्या प्राप्त हो रही है जिसके लिए हम महीने का उपयोग monthrange जो ब्लेयर कॉनराड ने पहले से ही अपने समाधान का उल्लेख किया है:

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

दूसरी को आखिरी तारीख मिल रही है जिसे हम replace करने की मदद से करते हैं

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

और जब हम शीर्ष पर उल्लिखित के रूप में उन्हें गठबंधन करते हैं तो हमें गतिशील समाधान मिलता है।


मेरे पास एक साधारण समाधान है:

import datetime   
datetime.date(2012,2, 1).replace(day=1,month=datetime.date(2012,2,1).month+1)-timedelta(days=1)
datetime.date(2012, 2, 29)

मेरे लिए यह सबसे आसान तरीका है:

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)

मैंने पहले यह नोटिस नहीं किया था जब मैं कैलेंडर मॉड्यूल के लिए प्रलेखन देख रहा था, लेकिन 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)

मेरा पिछला उत्तर अभी भी काम करता है, लेकिन स्पष्ट रूप से उपमहाद्वीप है।


यदि आप 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

यदि आप किसी दिनांक सीमा में गुजरते हैं, तो आप इसका उपयोग कर सकते हैं:

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

यदि आप बाहरी पुस्तकालय का उपयोग करने के इच्छुक हैं, तो http://crsmithdev.com/arrow/

यू के साथ महीने के आखिरी दिन के साथ मिल सकता है:

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

यह एक तिथि वस्तु देता है जिसे आप अपने हेरफेर कर सकते हैं।


यह वास्तव में 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)

यहां एक समाधान आधारित पायथन लैम्बडास है:

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 लैम्ब्डा अगले महीने के पहले दिन के ट्यूपल का प्रतिनिधित्व पाता है, और अगले वर्ष तक चलता है। month_end lambda एक तिथि ( dte ) को एक dte बदल देता है, next_month लागू होता है और एक नई तारीख बनाता है। फिर "महीने का अंत" अगले महीने का पहला दिन शून्य timedelta(days=1)


संपादित करें: एक क्लीनर समाधान के लिए @ ब्लेयर कॉनराड का जवाब देखें

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

सबसे आसान तरीका (कैलेंडर आयात किए बिना), अगले महीने का पहला दिन प्राप्त करना है, और उसके बाद से एक दिन घटाएं।

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)

पीएस: 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

यह कोड मानता है कि आप महीने के आखिरी दिन की तारीख चाहते हैं (यानी, न केवल डीडी भाग, बल्कि पूरे YYYYMMDD दिनांक)


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

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

आउटपुट:

31



यह पिछले महीने जो कुछ भी हो, उसका आखिरी दिन प्रिंट करेगा। इस उदाहरण में यह 15 मई, 2016 था। इसलिए आपका आउटपुट अलग हो सकता है, हालांकि आउटपुट वर्तमान महीने जितना दिन होगा। बढ़िया है यदि आप दैनिक क्रॉन नौकरी चलाकर महीने के आखिरी दिन की जांच करना चाहते हैं।

इसलिए:

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

जब तक यह महीने का आखिरी दिन न हो।





date