6

我正在尝试编写一个 Python 脚本来计算当月有多少工作日。例如如果month = August那么businessDays = 22

这是我发现月份的代码:

def numToMonth( num ):
   months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
   return str(months[ num - 1 ])

这段代码工作正常,我可以硬编码另一个函数来匹配月份与该月应该包含多少天......但这对工作日没有帮助。

有什么帮助吗?我习惯了 C、C++,所以请不要抨击我的 Python“技能”。

编辑:我无法在我的机器上安装任何额外的库或模块,因此请使用默认 Python 模块发布答案。(Python 2.7datetime等)另外,我的电脑有 Windows 7 操作系统。

4

8 回答 8

11

这是一种冗长的方式,但至少它可以工作并且不需要标准模块以外的任何东西。

import datetime

now = datetime.datetime.now()
holidays = {datetime.date(now.year, 8, 14)} # you can add more here
businessdays = 0
for i in range(1, 32):
    try:
        thisdate = datetime.date(now.year, now.month, i)
    except(ValueError):
        break
    if thisdate.weekday() < 5 and thisdate not in holidays: # Monday == 0, Sunday == 6 
        businessdays += 1

print businessdays
于 2013-08-14T14:18:18.163 回答
9

我会简单地使用内置模块日历

import calendar

weekday_count = 0
cal = calendar.Calendar()

for week in cal.monthdayscalendar(2013, 8):
    for i, day in enumerate(week):
        # not this month's day or a weekend
        if day == 0 or i >= 5:
            continue
        # or some other control if desired...
        weekday_count += 1

print weekday_count

就是这样。

于 2013-08-14T14:42:43.823 回答
5

我想补充一下我的答案。

我正在使用日历、列表理解和长度来计算特定月份的工作日有多少天。

这是我的代码:

#!/bin/env python

import calendar
import datetime

now = datetime.datetime.now()

cal = calendar.Calendar()

working_days = len([x for x in cal.itermonthdays2(now.year, now.month) if x[0] !=0 and x[1] < 5])

print "Total working days this month: " + str(working_days)
于 2018-03-27T06:56:47.187 回答
1

我从 Sharuzzaman 的解决方案中偷了这个,并为假期添加了一个字典,并将其变成了一个函数:

import calendar
cal = calendar.Calendar()

def get_wdim(year,month):
    working_days = len([x for x in cal.itermonthdays2(year, month) if x[0] !=0 and x[1] < 5]) 
    holidays = {
        1:1,
        2:1,
        4:1,
        5:1,
        7:1,
        9:1,
        10:1,
        11:4,
        12:1
    }
    return int(working_days) - holidays.get(month,0)


wdim2022 = [get_wdim(2022,x) for x in list(range(1,13)) ]   

于 2021-11-04T17:43:04.747 回答
0

更新: OP 不能使用任何外部库。然后,您将不得不根据从日历中确定星期几来构建一些表。

公式为 d + m + y + y/4 + (c mod 7),其中:d 是月份中的日期,m 是月份表中的月份编号,y 是年份的最后两位数字,并且c 是世纪数。

这很乏味但并非不可能!

ORIG 回答:自己编写代码很乏味,因为 2013 年 8 月 1 日和 2012 年 8 月 1 日不一定是一周中的同一天。我将从 python 中的“日期”类开始(详细信息在这里

from datetime import date
datetime.date(2002, 3, 11)
t = d.timetuple()
for i in t:     
   print i

特别是,查看“datetime.weekday()”函数。

于 2013-08-14T13:36:26.043 回答
0

这个比较简单,把它分解成几个步骤:

  1. 您需要能够循环浏览一个月中的日子。
  2. 您需要能够确定任何给定日期所在的星期几。维基百科列出了一些方法。
  3. 然后,您只需要将一周中的日期标记为工作日或不标记。

结合这些步骤,您将拥有一个工作方法。

于 2013-08-14T13:40:24.167 回答
0

您可以看一下,datetime.datetime.dayofweek()但如果您不允许使用外部库,那么您需要:

  1. 选择一个你知道星期几的日期——最好是星期一
  2. 想出一个公式来计算自给定月份的第一天以来的天数。
  3. 对于一个月中的每一天,[5, 6] 中的(自您的一天以来的天数)% 7 是一个周末。
于 2013-08-14T13:58:54.427 回答
0

考虑到问题在搜索中的排名(以及标题中没有说明的事实),承认 OP 声明无法使用外部库,我想我会分享一个 pandas 解决方案,它提供了一个跨越多个月的解决方案,与结果以 df 形式呈现。

    import pandas as pd
    business_days = pd.date_range(start, end, freq='B')
    pd.DataFrame(index=business_days, data=[1] * len(business_days)).resample('M').sum()
于 2021-10-27T13:11:52.017 回答