Son Gün Python Ayın alın

oy
430

Kolayca (yani bir işlev çağrısı), belirli bir ayın son günü belirlemek için Python'ın standart kitaplığı kullanarak bir yolu var mı?

standart kütüphanesi bu desteklemiyorsa, dateutil paketi buna destek mi?

Oluştur 04/09/2008 saat 01:54
kaynak kullanıcı
Diğer dillerde...                            


31 cevaplar

oy
58

DÜZENLEME: daha temiz bir çözüm için @Blair Conrad'ın yanıta bakın


>>> import datetime
>>> datetime.date (2000, 2, 1) - datetime.timedelta (days = 1)
datetime.date(2000, 1, 31)
>>> 
Cevap 04/09/2008 saat 02:26
kaynak kullanıcı

oy
36

DÜZENLEME: bkz benim diğer cevabı . Ben sadece birisi bir hesap "Kendi rulo" nasıl görmeye ilgilenen diye burada bırakmak bu bir, daha iyi bir uygulama vardır.

@John Millikin sonraki ayın ilk günü hesaplama eklenen komplikasyonu ile iyi bir cevap verir.

Aşağıdaki özellikle zarif değildir, ancak belirli bir tarih yaşıyor o ayın son günü anlamaya, sen deneyebilirsiniz:

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)
Cevap 04/09/2008 saat 03:25
kaynak kullanıcı

oy
783

Ben bakarken ben bunu daha önce fark etmedi takvim modülü için belgelere , ama adı verilen bir yöntem monthrange bu bilgileri sağlar:

monthrange (yıl, ay)
    belirtilen yıl ve ay için, ayın gün ay ve numaranın ilk günün hafta içi döndürür.

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

yani:

calendar.monthrange(year, month)[1]

gitmek için en basit yol gibi görünüyor.

Daha açıkçası, monthrangehem de sıçrama yılı destekler:

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

Benim daha önceki cevabı hâlâ çalışmaktadır, ancak açıkça suboptimaldir.

Cevap 04/09/2008 saat 13:44
kaynak kullanıcı

oy
11

Başka bir çözüm böyle bir şey yapmak olacaktır:

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

Ve böyle işlevini kullanın:

>>> 
>>> 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)
Cevap 10/12/2008 saat 16:47
kaynak kullanıcı

oy
-6

i basit bir çözüm vardır:

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)
Cevap 22/08/2012 saat 00:09
kaynak kullanıcı

oy
1

Bu ana sorusunu sormaz, ama bir güzel hüner son olsun hafta içi bir ay içinde kullanmaktır calendar.monthcalendarson olarak Pazar'a ilk sütunda Pazartesi organize tarihlerin bir matris, döndüren.

# 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

Bütün [0:-2]şey haftasonu sütunları tıraş ve onları dışarı atılmasıdır. Ayın dışında kalan Tarihler 0 ile gösterilir, bu yüzden maksimum etkili bir şekilde yok sayar.

Kullanımı numpy.ravelkesinlikle gerekli değildir, ancak ben güvenerek nefret sadece kongrenumpy.ndarray.max boyunca hesaplamak için hangi ekseni bildirilmediği takdirde diziyi dümdüz olacak.

Cevap 14/11/2012 saat 21:06
kaynak kullanıcı

oy
88

Almak istemiyorsanız calendarmodülü, basit bir iki adımlı fonksiyonu da olabilir:

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)

Çıktılar:

>>> 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
Cevap 26/11/2012 saat 13:48
kaynak kullanıcı

oy
27

Bu aslında oldukça kolaydır dateutil.relativedelta(pip için paket piton-datetutil). day=31Her zaman, her zaman ayın son günü dönecektir.

Örnek:

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)
Cevap 21/02/2013 saat 05:09
kaynak kullanıcı

oy
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)
Cevap 16/06/2013 saat 17:51
kaynak kullanıcı

oy
0

Kendi küçük işlevi yapmak istiyorsanız, bu iyi bir başlangıç ​​noktasıdır:

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

Bunun için artık yıllarda kurallarını bilmek zorunda:

  • Her dört yılda
  • Her 100 yıl hariç
  • ama yine her 400 yıl
Cevap 30/04/2014 saat 09:33
kaynak kullanıcı

oy
9
from datetime import timedelta
(any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
Cevap 03/05/2014 saat 18:16
kaynak kullanıcı

oy
3

Benim için en basit yolu şudur:

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)
Cevap 24/07/2014 saat 10:16
kaynak kullanıcı

oy
12

Kullanılması relativedeltaseni böyle ayın son tarihini alacağı:

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

Fikir ayın yumruk gün olsun ve kullanmaktır relativedeltaistediğin ayın son gününü alacağı çok önceden 1 ay ve 1 gün geri dönmek için.