How to get the last day of the month?

后端 未结 30 2586
迷失自我
迷失自我 2020-11-22 06:13

Is there a way using Python\'s standard library to easily determine (i.e. one function call) the last day of a given month?

If the standard library doesn\'t support

相关标签:
30条回答
  • 2020-11-22 06:55
    >>> 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
    
    0 讨论(0)
  • 2020-11-22 06:55

    The easiest way (without having to import calendar), is to get the first day of the next month, and then subtract a day from it.

    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
    

    Output:

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

    PS: This code runs faster as compared to the import calendarapproach; see below:

    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)
    

    OUTPUT:

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

    This code assumes that you want the date of the last day of the month (i.e., not just the DD part, but the entire YYYYMMDD date)

    0 讨论(0)
  • 2020-11-22 06:55

    you can use relativedelta https://dateutil.readthedocs.io/en/stable/relativedelta.html month_end = <your datetime value within the month> + relativedelta(day=31) that will give you the last day.

    0 讨论(0)
  • 2020-11-22 06:56

    Use pandas!

    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
    
    0 讨论(0)
  • 2020-11-22 06:58

    Another solution would be to do something like this:

    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
    

    And use the function like this:

    >>> 
    >>> 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)
    
    0 讨论(0)
  • 2020-11-22 07:00

    I prefer this way

    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 讨论(0)
提交回复
热议问题