如何使用Python确定一个月内的所有周数?

时间:2017-11-02 20:56:20

标签: python python-3.x

我遇到以下问题:如果,请确定该特定月份中包含的周数,即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]

2 个答案:

答案 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]