首页 文章

最近的Python工作日

提问于
浏览
58

我需要从当前日期减去工作日 .

我目前有一些代码需要始终在最近的工作日运行 . 因此,如果我们在星期六或星期日这可能是今天,那么我需要将它设置回周末前的星期五 . 我目前有一些漂亮的 clunky 代码来执行此操作:

lastBusDay = datetime.datetime.today()
 if datetime.date.weekday(lastBusDay) == 5:      #if it's Saturday
     lastBusDay = lastBusDay - datetime.timedelta(days = 1) #then make it Friday
 elif datetime.date.weekday(lastBusDay) == 6:      #if it's Sunday
     lastBusDay = lastBusDay - datetime.timedelta(days = 2); #then make it Friday

有没有更好的办法?

我可以告诉timedelta在工作日而不是日历日工作吗?

9 回答

  • 4
    def getNthBusinessDay(startDate, businessDaysInBetween):
        currentDate = startDate
        daysToAdd = businessDaysInBetween
        while daysToAdd > 0:
            currentDate += relativedelta(days=1)
            day = currentDate.weekday()
            if day < 5:
                daysToAdd -= 1
    
        return currentDate
    
  • 6

    用熊猫!

    import pandas as pd
    # BDay is business day, not birthday...
    from pandas.tseries.offsets import BDay
    
    # pd.datetime is an alias for datetime.datetime
    today = pd.datetime.today()
    print today - BDay(4)
    

    从今天是9月26日星期四,这将给你一个输出:

    datetime.datetime(2013, 9, 20, 14, 8, 4, 89761)
    
  • 0

    如果您愿意安装额外的库,似乎有几种选择 .

    这篇文章描述了一种使用dateutil定义工作日的方法 .

    http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html

    BusinessHours允许您自定义您的假期列表等,以定义您的工作时间(以及延长工作日) .

    http://pypi.python.org/pypi/BusinessHours/

  • 97

    DISCLAMER: 我是作者......

    我写了一个包,它完成了这个,业务日期计算 . 您可以使用自定义周规格和假期 .

    我在使用财务数据时遇到了这个问题,并且没有找到任何可用的解决方案特别容易,所以我写了一个 .

    希望这对其他人有用 .

    https://pypi.python.org/pypi/business_calendar/

  • 0

    也许这段代码可以帮助:

    lastBusDay = datetime.datetime.today()
    shift = datetime.timedelta(max(1,(lastBusDay.weekday() + 6) % 7 - 3))
    lastBusDay = lastBusDay - shift
    

    这个想法是,在星期一,你必须回到3天,在星期日2和1在任何其他日子 .

    声明 (lastBusDay.weekday() + 6) % 7 只是将周一从0改为6 .

    真的不知道这在性能方面是否会更好 .

  • 9

    timeboard包这样做 .

    假设您的日期是2017年9月4日 . 尽管是星期一,但这是在美国度假(劳动节) . 因此,最近的工作日是9月1日星期五 .

    >>> import timeboard.calendars.US as US
    >>> clnd = US.Weekly8x5()
    >>> clnd('04 Sep 2017').rollback().to_timestamp().date()
    datetime.date(2017, 9, 1)
    

    在英国,2017年9月4日是正常工作日,因此最近的工作日本身就是如此 .

    >>> import timeboard.calendars.UK as UK
    >>> clnd = UK.Weekly8x5()
    >>> clnd('04 Sep 2017').rollback().to_timestamp().date()
    datetime.date(2017, 9, 4)
    

    免责声明:我是时间板的作者 .

  • 2

    如果你想跳过美国假期和周末,这对我有用(使用pandas 0.23.3):

    import pandas as pd
    from pandas.tseries.holiday import USFederalHolidayCalendar
    from pandas.tseries.offsets import CustomBusinessDay
    US_BUSINESS_DAY = CustomBusinessDay(calendar=USFederalHolidayCalendar())
    july_5 = pd.datetime(2018, 7, 5)
    result = july_5 - 2 * US_BUSINESS_DAY # 2018-7-2
    

    要转换为python日期对象,我这样做:

    result.to_pydatetime().date()
    
  • 3

    这将给出一个工作日的生成器,当然没有假期,stop是datetime.datetime对象 . 如果您需要假期,只需在假期列表中添加其他参数并查看“IFology”;-)

    def workingdays(stop, start=datetime.date.today()):
        while start != stop:
            if start.weekday() < 5:
                yield start
            start += datetime.timedelta(1)
    

    以后你可以算一下

    workdays = workingdays(datetime.datetime(2015, 8, 8))
    len(list(workdays))
    
  • 13

    你为什么不尝试这样的事情:

    lastBusDay = datetime.datetime.today()
    if datetime.date.weekday(lastBusDay) not in range(0,5):
        lastBusDay = 5
    

相关问题