Alchemist777
Alchemist777

Reputation: 1681

Count number of sundays in current month

How can I get the numberof Sundays of the current month in Python?

Anyone got any idea about this?

Upvotes: 11

Views: 16220

Answers (8)

eccentricOrange
eccentricOrange

Reputation: 1212

My solution.

The following was inspired by @Lingson's answer, but I think it does lesser loops.

import calendar

def get_number_of_weekdays(year: int, month: int) -> list:
    main_calendar = calendar.monthcalendar(year, month)
    number_of_weeks = len(main_calendar)
    number_of_weekdays = []

    for i in range(7):
        number_of_weekday = number_of_weeks

        if main_calendar[0][i] == 0:
            number_of_weekday -= 1
        
        if main_calendar[-1][i] == 0:
            number_of_weekday -= 1

        number_of_weekdays.append(number_of_weekday)

    return sum(number_of_weekdays)  # In my application I needed the number of each weekday, so you could return just the list to do that.

Upvotes: 0

Lingson
Lingson

Reputation: 71

I happened to need a solution for this, but was unsatisfactory with the solutions here, so I came up with my own:

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)

Upvotes: 7

mgilson
mgilson

Reputation: 309959

Another example using calendar and 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])

Perhaps a slightly faster way to do it would be:

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))

Upvotes: 1

Jon Clements
Jon Clements

Reputation: 142176

My take: (saves having to worry about being in the right month etc...)

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)

Or, as @mgilson has pointed out, you can do away with the list-comp, and wrap it all up as a generator:

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

And I suppose, you could throw in a:

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

Upvotes: 4

root
root

Reputation: 80346

This gives you the number of sundays in a current month as you wanted:

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

Upvotes: 7

Alexander Stefanov
Alexander Stefanov

Reputation: 534

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

PAY ATTENTION: Here are the Calendar.itermonthdates's docs:

Return an iterator for one month. The iterator will yield datetime.date values and will always iterate through complete weeks, so it will yield dates outside the specified month.

That's why day.month == MONTH is needed

If you want the weekdays to be in range 0-6, use day.weekday(), if you want them to be in range 1-7, use day.isoweekday()

Upvotes: 0

ecatmur
ecatmur

Reputation: 157374

You can do this using ISO week numbers:

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 general for a particular day of the week (1 = Monday, 7 = Sunday) the calculation is:

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

Upvotes: 0

jro
jro

Reputation: 9484

I'd do it like this:

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

Upvotes: 4

Related Questions