[python] 매월 마지막 날을 얻는 방법?

주어진 달의 마지막 날을 쉽게 결정하기 위해 파이썬의 표준 라이브러리를 사용하는 방법이 있습니까?

표준 라이브러리가이를 지원하지 않으면 dateutil 패키지가이를 지원합니까?



답변

나는 모듈 에 대한 문서를calendar 볼 때 이것을 일찍 알지 못했지만 라는 메소드가 monthrange다음 정보를 제공합니다.

monthrange (year, month)
    지정된 연도 및 월에 대해 월의 첫 번째 요일과 월의 일 수를 반환합니다.

>>> 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모듈 을 가져 오지 않으려는 경우 간단한 2 단계 기능도 있습니다.

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


답변

편집 : 깨끗한 솔루션에 대해서는 @Blair Conrad의 답변을 참조하십시오


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


답변

이것은 실제로 꽤 쉽습니다 dateutil.relativedelta(pip 용 python-datetutil 패키지). 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)


답변

편집 : 내 다른 대답을 참조하십시오 . 이것은이 것보다 더 나은 구현을 가지고 있는데, 누군가가 자신의 계산기를 어떻게 굴릴 수 있는지 알고 싶은 경우를 대비하여 여기에 남겨둔다.

@John Millikin은 다음 달 첫 날 계산의 복잡성을 추가하여 좋은 답변을 제공합니다.

다음은 특히 우아하지는 않지만 주어진 날짜가 사는 달의 마지막 날을 파악하기 위해 시도해 볼 수 있습니다.

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)


답변

dateutil.relativedelta당신을 사용하면 다음과 같이 마지막 달의 날짜를 얻을 수 있습니다 :

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

아이디어는 달의 첫날을 가져 와서 한 relativedelta달 앞뒤로 돌아가서 원하는 달의 마지막 날을 얻는 것입니다.


답변

또 다른 해결책은 다음과 같이하는 것입니다.

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)