2012-10-19 24 views

risposta

6

Questo ti dà il numero di domeniche in un mese in corso, come si voleva:

import calendar 
from datetime import datetime 

In [367]: len([1 for i in calendar.monthcalendar(datetime.now().year, 
            datetime.now().month) if i[6] != 0]) 
Out[367]: 4 
2

lo farei in questo modo:

import datetime 

today = datetime.date.today() 
day = datetime.date(today.year, today.month, 1) 
single_day = datetime.timedelta(days=1) 

sundays = 0 
while day.month == today.month: 
    if day.weekday() == 6: 
     sundays += 1 
    day += single_day 

print 'Sundays:', sundays 
0

È possibile farlo utilizzando i numeri di settimana ISO:

from datetime import date 
bom = date.today().replace(day=1)     # first day of current month 
eom = (date(bom.year, 12, 31) if bom.month == 12 else 
     (bom.replace(month=bom.month + 1) - 1)) # last day of current month 
_, b_week, _ = bom.isocalendar() 
_, e_week, e_weekday = eom.isocalendar() 
num_sundays = (e_week - b_week) + (1 if e_weekday == 7 else 0) 

In generale per un particolare giorno della settimana (1 = Lunedi, 7 = Domenica) il calcolo è:

num_days = ((e_week - b_week) + 
      (-1 if b_weekday > day else 0) + 
      (1 if e_weekday >= day else 0)) 
0
import calendar 

MONTH = 10  
sundays = 0 
cal = calendar.Calendar() 

for day in cal.itermonthdates(2012, MONTH): 
    if day.weekday() == 6 and day.month == MONTH: 
     sundays += 1 

ATTENZIONE: Qui ci sono documenti del Calendar.itermonthdates:

restituire un iteratore per un mese. L'iteratore produrrà i valori datetime.date e sarà sempre iterato per settimane complete, quindi produrrà date al di fuori del mese specificato.

Ecco perché è necessario day.month == MONTH

Se si desidera che i giorni della settimana per essere nella gamma 0-6, utilizzare day.weekday(), se si vuole che siano nella gamma 1-7, utilizzare day.isoweekday()

1

un altro esempio utilizzando calendar e datetime:

import datetime 
import calendar 
today = datetime.date.today() 
m = today.month 
y = today.year 
sum(1 for week in calendar.monthcalendar(y,m) if week[-1]) 

Forse un modo leggermente più veloce per farlo sarebbe:

first_day,month_len = monthrange(y,m) 
date_of_first_sun = 1+6-first_day 
print sum(1 for x in range(date_of_first_sun,month_len+1,7)) 
+1

Mi piacerebbe migliorare su questo se si lascia un feedback :). – mgilson

+0

Penso che questo potrebbe essere sbagliato in alcune situazioni. Cosa succede se il 1 ° e il 2 ° del mese sono sabato e domenica? Poi il 29 e il 30 saranno anche sabato e domenica. –

+0

@AlexanderStefanov - Allora? Non vedo il tuo punto qui ...(questo potrebbe essere sbagliato era abbastanza chiaro, ma non capisco il tuo razionale) – mgilson

4

La mia opinione: (salva doversi preoccupare di essere nel mese destra ecc ...)

from calendar import weekday, monthrange, SUNDAY 

y, m = 2012, 10 

days = [weekday(y, m, d+1) for d in range(*monthrange(y, m))] 
print days.count(SUNDAY) 

O, come @mgilson ha fatto notare, è possibile farla finita con la lista-comp, e avvolgere il tutto come un generatore:

sum(1 for d in range(*monthrange(y,m)) if weekday(y,m,d+1)==SUNDAY) 

E suppongo, si potrebbe gettare in un:

from collections import Counter 
days = Counter(weekday(y, m, d + 1) for d in range(*monthrange(y, m))) 
print days[SUNDAY] 
+0

Perché ripetere due volte ? print sum (1 per d nel range (* monthrange (y, m)) nei giorni feriali (y, m, d + 1) == SUNDAY) ' – mgilson

+0

@mgilson Era semplice - in realtà avevo' sum (1 ...) 'apri nell'interprete ma lo cambio in una lista-comp e .count per postare qui :) –

2

mi è capitato di avere bisogno di una soluzione per questo, ma non era soddisfacente con le soluzioni qui, così mi si avvicinò con la mia:

import calendar 

year = 2016 
month = 3 
day_to_count = calendar.SUNDAY 

matrix = calendar.monthcalendar(year,month) 

num_days = sum(1 for x in matrix if x[day_to_count] != 0) 
Problemi correlati