【问题标题】:Using Python to count the number of business days in a month?使用 Python 计算一个月的工作日数?
【发布时间】:2013-08-14 13:29:20
【问题描述】:

我正在尝试编写一个 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.7、datetime 等)另外,我的电脑有 Windows 7 操作系统。

【问题讨论】:

  • 感谢您的链接!我查看了这个问题,但我不允许在我的机器上安装额外的库。我将编辑我的问题以反映这一点。
  • 您的代码应该正确处理假期吗?
  • 不会有什么坏处,但这不是优先事项。我可以根据月份将假期硬编码到代码中。我的工作场所与英国有关,所以他们的假期很奇怪。
  • 它应该计算当年的天数吗?

标签: python date


【解决方案1】:

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

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

【讨论】:

  • 感谢您的帮助!我不得不稍微修改代码..(你的缩进很奇怪)但它有效。再次感谢。
  • 没问题。我的压痕有什么奇怪的地方?上面的代码只捕获长行和注释样式的 PEP8 错误。
  • 看起来像一个黑客,但我会这样做 :) 并且它有效。那谢谢啦。小评论:为什么要硬编码年份?获得预算要求您的老板在 2014 年重新开放该计划以进行大规模维护? :)
  • @Jean-FrançoisFabre 在我的国家(南非),大多数假期并非每年都在确切指定的日期,因为如果它们是周末,则观察它们的日期会更改为下周一。所以我实际上会想象你会有一个每年都会不同的假期日历。 ;-)
【解决方案2】:

我会简单地使用内置模块calendar

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

就是这样。

【讨论】:

  • 日历是从星期一开始而不是星期日吗?
【解决方案3】:

我想添加我的答案。

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

这是我的代码:

#!/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)

【讨论】:

    【解决方案4】:

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

    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)) ]   
    
    

    【讨论】:

      【解决方案5】:

      更新: OP 不能使用任何外部库。然后你将不得不基于determining the day of the week from the calendar构建一些表。

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

      这很乏味但并非不可能!

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

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

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

      【讨论】:

        【解决方案6】:

        这个比较简单,分解成几个步骤即可:

        1. 您需要能够循环浏览一个月中的日子。
        2. 您需要能够确定任何给定日期所在的星期几。 Wikipedia 列出了一些方法。
        3. 那么您只需将一周中的某天标记为工作日或不标记为工作日。

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

        【讨论】:

        • 感谢您鼓励我进行更多研究,但我一直在寻找 Python 中已内置的方法。如果它不存在,我将发布我创建的任何算法作为答案。
        【解决方案7】:

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

        1. 选择一个您知道星期几的日期 - 最好是 星期一
        2. 想出一个公式来计算从那以后的天数 给定月份的第一天是。
        3. 对于该月的每一天,(自您 day) [5, 6] 中的 % 7 是周末。

        【讨论】:

          【解决方案8】:

          承认 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()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-18
            • 1970-01-01
            • 1970-01-01
            • 2014-09-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多