我遇到以下问题:如果年且月,请确定该特定月份中包含的周数,即2017年10月包含周数39 ,40,41,42,43,44。 警告:通常,周从星期一开始,到星期日结束。我有一个繁琐的代码可以解决问题,但我想知道是否有更优雅或Python的方式来做到这一点。
from datetime import datetime
import calendar
def get_week_numbers_in_month(year,month):
list_of_weeks = []
initial_day = 1
ending_day = calendar.monthrange(int(year),int(month))[1] #get the last day of month
initial_week = int(datetime(year,month,initial_day).isocalendar()[1])
ending_week = int(datetime(year,month,ending_day).isocalendar()[1])
counter = initial_week
while(counter <= ending_week):
list_of_weeks.append(counter)
counter += 1
return list_of_weeks
print("Your month contains the following weeks:\n"+str(get_week_numbers_in_month(2017,10)))
# result: Your month contains the following weeks:
# [39, 40, 41, 42, 43, 44]
答案 0 :(得分:1)
您只需返回range即可避免整个初始化过程。另请注意,isocalendar
返回3元组的整数:
from datetime import datetime
import calendar
def get_week_numbers_in_month(year,month):
ending_day = calendar.monthrange(year, month)[1] #get the last day of month
initial_week = datetime(year, month, 1).isocalendar()[1]
ending_week = datetime(year, month, ending_day).isocalendar()[1]
return range(initial_week, ending_week + 1)
print("Your month contains the following weeks:")
print(get_week_numbers_in_month(2017,10))
# range(39, 45)
如果您确实想要返回列表,只需返回list(range(...))
答案 1 :(得分:0)
我本来可以将此添加为评论,但没有足够的声誉来做到这一点...
批准的答案似乎在12月份实际上不起作用,因为它有时会溢出到第1周。此外,为什么在创建范围时要在最后加上一个星期?
可接受的答案:
def get_week_numbers_in_month(year,month):
ending_day = calendar.monthrange(year, month)[1] #get the last day of month
initial_week = datetime(year, month, 1).isocalendar()[1]
ending_week = datetime(year, month, ending_day).isocalendar()[1]
return range(initial_week, ending_week + 1)
print(get_week_numbers_in_month(2019,12))
# range(48, 2)
print(list(get_week_numbers_in_month(2019,12)))
# []
您实际上需要添加一些其他逻辑来自己构建列表,而不是使用range
def get_week_numbers_in_month(year,month):
ending_day = calendar.monthrange(year, month)[1] #get the last day of month
initial_week = datetime(year, month, 1).isocalendar()[1]
ending_week = datetime(year, month, ending_day).isocalendar()[1]
# Adding logic to build week list if month is December (12)
if month = 12:
week_list = []
while week != ending_week:
if week not in week_list:
week_list.append(week)
else:
if week >= 52:
week = 1
else:
week += 1
week_list.append(week)
else:
week_list = list(range(initial_week, ending_week))
return week_list
print(get_week_numbers_in_month(2019,12))
# [48, 49, 50, 51, 52, 1]