Jak mogę uzyskać liczbę niedziel w bieżącym miesiącu w Pythonie?Liczba niedziel w bieżącym miesiącu
Ktoś ma jakiś pomysł na ten temat?
Jak mogę uzyskać liczbę niedziel w bieżącym miesiącu w Pythonie?Liczba niedziel w bieżącym miesiącu
Ktoś ma jakiś pomysł na ten temat?
daje to liczbę niedziele w miesiącu, jak chcieliśmy:
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
zrobiłbym to tak:
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
Można to zrobić za pomocą numerów tygodniu 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)
w ogóle dla danego dnia tygodnia (1 = poniedziałek, 7 = niedziela) obliczenia:
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
PŁATNA UWAGA: Oto dokumentacja Calendar.itermonthdates:
Zwraca iterator na okres jednego miesiąca. Iterator przyniesie wartości datetime.date i zawsze będzie iterować przez całe tygodnie, więc przyniesie dat poza podanym miesiącem.
Dlatego day.month == MONTH
jest potrzebne
Jeśli chcesz dni tygodnia, aby być w zakresie 0-6, należy day.weekday()
, jeśli chcesz, żeby być w zakresie 1-7, należy day.isoweekday()
Innym przykładem korzystania calendar
i 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])
Być może nieznacznie szybszy sposób to zrobić byłoby:
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))
My się: (oszczędza konieczności martwienia się o bycie w odpowiednim miesiącu 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)
Lub, jak zauważył @mgilson, można pozbyć się kompilatora list i zawinąć go jako generator:
sum(1 for d in range(*monthrange(y,m)) if weekday(y,m,d+1)==SUNDAY)
I przypuszczam, można rzucać w:
from collections import Counter
days = Counter(weekday(y, m, d + 1) for d in range(*monthrange(y, m)))
print days[SUNDAY]
Dlaczego iteracja dwa razy ? 'print sum (1 dla d w zakresie (* monthrange (y, m)) jeśli dzień powszedni (y, m, d + 1) == SUNDAY)' – mgilson
@mgilson Utrzymanie tego było proste - faktycznie miałem 'sumę (1 ...) 'otwórz w tłumaczu, ale zmienił go z powrotem na listę-comp i .count do zamieszczenia tutaj :) –
zdarzyło mi się potrzebne jest rozwiązanie dla tego, ale była niezadowalająca z rozwiązaniami tutaj, więc wpadłem na własną rękę:
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)
Chciałbym poprawić w tej sprawie, jeśli zostawisz jakieś uwagi :). – mgilson
Myślę, że może to być złe w niektórych sytuacjach. Co jeśli 1. i 2. w miesiącu to sobota i niedziela? Następnie 29 i 30 będzie również w sobotę i niedzielę. –
@AlexanderStefanov - So? Nie widzę twojego punktu tutaj ...(to może być złe, było wystarczająco jasne, ale nie rozumiem waszego rozumowania) – mgilson