首页 文章

Python - 如何排除星期六 . 和太阳从几个星期

提问于
浏览
3

我希望有人能给我一些例子,说明我可以返回执行以下操作的日历数据 .


  • 返回任何给定月份(过去/现在/将来)的天数,但不包括星期六和星期日 .

Example:

输入('Year: ') - 2018

输入('Month: ') - 7

End Result: (2018年)(7月)的工作日数为( 22 ) .


  • 在排除星期六后为每个工作日分配一个迭代器 . 和太阳

Example:

输入('Year: ') - 2018

输入('Month: ') - 7

输入('date: ') - 20

End Result: (20)是( Friday )并且是(7月),(2018)的( 15weekday .

这是我迄今为止能够创建的代码......

import calendar

year = float(input('Year: '))
month = float(input('Month: '))
input_year = []
input_month = []

if year >= 1000 and year <=3000:
    input_year.append(year)
if month >= 1 and month <=12:
    input_month.append(month)

cal_format = calendar.TextCalendar(calendar.MONDAY)
result_cal = cal_format.formatmonth(int(input_year[0]), int(input_month[0]))
print(result_cal)

THE END RESULT IS...

Year: 1978
Month: 3
     March 1978
Mo Tu We Th Fr Sa Su
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

这只打印出星期六的文本日历 . 和太阳在每周结束时,所以我至少可以在视觉上排除它们 . 但我真的希望能够以编程方式排除它们,并能够输入上述变量来计算一个月的工作日,以及每个工作日在该月内 .

4 回答

  • 0

    这是查找上一个工作日数量的一种方法:

    请注意,年,月,日的类型转换为 int .

    import calendar
    
    year = int(input('Year: '))
    month = int(input('Month: '))
    day = int(input('Day: '))
    
    full_wks = day / 7
    extra_days = day % 7
    
    first_day = calendar.weekday(year, month, 1)
    if first_day >= 5:              # if month begins on a weekend
        weekend = 7 - first_day     # yields 1 if Sunday, 2 if Saturday
        extra_days -= weekend
    
    weekdays = full_wks * 5 + extra_days
    
    ordinal = lambda n: "{}{}".format(n, 'tsnrhtdd'[n%5*(n%100^15>4>n%10)::4])
    
    print "{}/{} is the {} weekday in the month.".format(month, day, ordinal(weekdays))
    

    输出:

    Year: 2018
    Month: 7
    Day: 20
    7/20 is the 15th weekday in the month.
    

    Code Golf上xsot的序号转换 .

  • 1

    我在大约10分钟内做了一个简单的解决方案 . 我的方法很大程度上依赖于列表推导和字符串方法,例如join和split,所以如果你不熟悉它们,我建议你查看它们 . 首先将结果拆分为行,tittle需要被删除,其他行需要删除最后一个字符 .

    通过使用strip()方法在行的乞讨处删除空白,然后预先添加两个空格来接收第一行 .

    在周末使用列表推导仅包含每行的前15个字符 .

    最后一部分是最难的 . 我的想法是计算格式化日历中有多少天数 . 首先将带有日期数的所有行放入一个大行,然后用空格分割行以获得所有日期数的列表,最后使用列表的大小 .

    import calendar
    
    year = float(input('Year: '))
    month = float(input('Month: '))
    input_year = []
    input_month = []
    
    if year >= 1000 and year <=3000:
        input_year.append(year)
    if month >= 1 and month <=12:
        input_month.append(month)
    
    cal_format = calendar.TextCalendar(calendar.MONDAY)
    result_cal = cal_format.formatmonth(int(input_year[0]), int(input_month[0]))
    
    lines = result_cal.split("\n") # Split result_cal into a list of lines
    title_line = lines[0] # Save first line, we want to edit this differently
    title_line = "  " + title_line.strip() # Change the indentation of the title line
    
    
    lines = lines[1:] # Now select lines below the first 
    lines = [line[:3*5] for line in lines] # Only Keep first 15 characters or each
                                           # line to exclude weekends. (5 weekdays *
                                           # 3 chars per day)
    
    lines = [line for line in lines if len(line.strip())] # Don't include empty lines
                                                          # happens if month starts
                                                          # on a weekend.
    
    # prints out the result
    print(title_line)
    for line in lines:
        print(line)
    
    # Next work out how many working days in month.
    nums = "".join(lines[1:]).split(" ") # Three parts: first lines[1:] means this
                                         # only looks at the portion of the calendar
                                         # with numbers written on then. 2nd "".join()
                                         # joins the lines into a single string on 1 line
                                         # 3rd the .split(" ") splits the string based on spaces
                                         # unfortunatly 2 consecutive spaces result in an empty
                                         # string.
    
    nums = [num for num in nums if len(num)] # Filters the empty string.
    print(f"There are {len(nums)} working days in the month you selected") # Prints result
    #(uses f-string, you may want to look them up, I find them to be very useful)
    
  • 0

    检查日期工作日的一种方法是使用 date 对象的weekday()方法 . 它位于python标准库 datetime 模块中 .

    date.weekday()以整数形式返回星期几,其中星期一为0,星期日为6.例如,日期(2002,12,4).weekday()== 2,星期三 . 另见isoweekday() .

    import datetime
    
    num_of_weekdays = 0
    weekday_list = []
    
    start_date = datetime.date(int(input_year[0]), int(input_month[0]), 1)
    cur_date = start_date
    while cur_date.month == start_date.month:
        if 0 <= cur_date.weekday() <= 4:  # if it is a weekday
            num_of_weekdays += 1
            weekday_list.append(cur_date.day)
        cur_date += datetime.timedelta(days=1)
    
    print("The number of weekdays in ({}) of ({}) is ({}).".format(
        input_month[0], input_year[0], num_of_weekdays))
    
    date_ = datetime.date(int(input_year[0]), int(input_month[0]), int(input_date[0]))
    index = weekday_list.index(int(input_date[0])) + 1
    print("The ({}) is a ({}) and is the ({}) weekday of ({}), ({}).".format(
        date_.day, date_.strftime('%A'), index, date_.month, date_.year)
    
  • 1

    要获得一个月中的工作日数量:

    import calendar
    
    weekdays = 0
    cal = calendar.Calendar()
    
    for week in cal.monthdayscalendar(2018, 7):
        for i, day in enumerate(week):
            # Check if is a weekday and the day is from this month
            if i < 5 and day != 0:
                weekdays += 1
    
    print weekdays
    

    要获取特定日期的工作日编号,您可以修改上述代码以在达到输入日时返回工作日计数 .

相关问题