Come posso ottenere il numero di domeniche del mese corrente in Python?Numero di conteggi nel mese corrente
Qualcuno ha qualche idea al riguardo?
Come posso ottenere il numero di domeniche del mese corrente in Python?Numero di conteggi nel mese corrente
Qualcuno ha qualche idea al riguardo?
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
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
È 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))
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()
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))
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]
Perché ripetere due volte ? print sum (1 per d nel range (* monthrange (y, m)) nei giorni feriali (y, m, d + 1) == SUNDAY) ' – mgilson
@mgilson Era semplice - in realtà avevo' sum (1 ...) 'apri nell'interprete ma lo cambio in una lista-comp e .count per postare qui :) –
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)
Mi piacerebbe migliorare su questo se si lascia un feedback :). – mgilson
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. –
@AlexanderStefanov - Allora? Non vedo il tuo punto qui ...(questo potrebbe essere sbagliato era abbastanza chiaro, ma non capisco il tuo razionale) – mgilson