Pythonで今月の日曜日の数を取得するにはどうすればよいですか?
誰かがこれについて何か考えを持っていますか?
これにより、現在の月の日曜日の日数が希望どおりに表示されます。
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
私はたまたまこれに対する解決策を必要としていましたが、ここでの解決策に満足できなかったので、私は自分自身を思いつきました:
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)
私はこのようにします:
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
私の見解:(適切な月にいることなどを心配する必要がなくなります...)
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)
または、@ mgilsonが指摘しているように、list-compを廃止して、すべてをジェネレーターとしてまとめることができます。
sum(1 for d in range(*monthrange(y,m)) if weekday(y,m,d+1)==SUNDAY)
そして、私はあなたが投げることができると思います:
from collections import Counter
days = Counter(weekday(y, m, d + 1) for d in range(*monthrange(y, m)))
print days[SUNDAY]
calendar
とを使用した別の例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])
おそらく、それを行うための少し速い方法は次のようになります。
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))
これは、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)
一般に、特定の曜日(1 =月曜日、7 =日曜日)の計算は次のとおりです。
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
注意を払ってください:Calendar.itermonthdatesのドキュメントは次のとおりです。
イテレータを1か月間返却します。イテレータはdatetime.date値を生成し、常に完全な週を反復処理するため、指定された月以外の日付を生成します。
だからday.month == MONTH
必要です
平日を0〜6の範囲にしday.weekday()
たい場合は、を使用します。平日を1〜7の範囲にしたい場合は、を使用します。day.isoweekday()
私の解決策。
以下は@Lingsonの回答に触発されたものですが、ループは少ないと思います。
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.