最近的Python工作日

Tho*_*wne 66 python datetime

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

我目前有一些代码需要始终在最近的工作日运行.所以今天可能是今天,如果我们是星期一到星期五,但如果是星期六或星期日,那么我需要把它设置回周末前的星期五.我目前有一些非常笨重的代码来做到这一点:

 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
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

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

Kyl*_*non 114

用熊猫!

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)
Run Code Online (Sandbox Code Playgroud)

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

datetime.datetime(2013, 9, 20, 14, 8, 4, 89761)
Run Code Online (Sandbox Code Playgroud)

  • 最新的熊猫版本(0.14.0)也支持假日日历 (5认同)
  • 安装pandas给vps增加了233M。所以我重新发明了一个准系统轮子。 (3认同)
  • 尼斯.这是正确的答案,今天.当我问Q时,大熊猫还是有点不完整. (2认同)

Ali*_* R. 13

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

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

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

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

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

  • 在所有文化中定义工作日不太可能是一个简单的问题,无法包含在标准库中. (2认同)
  • 一个有效的观点,我的申请确实是金融市场,埃及和以色列周日开放. (2认同)
  • 有没有人甚至使用BuinessHours?在1分钟内,我发现87行应该是`self.worktiming [1]`(缺少**self**),第51行应该是`extradays`(缺少**s**).源代码本身看起来很差,分散在整个分号中. (2认同)

小智 9

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

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

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

希望这对其他人有用.

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


TMC*_*TMC 8

也许这段代码可以帮助:

lastBusDay = datetime.datetime.today()
shift = datetime.timedelta(max(1,(lastBusDay.weekday() + 6) % 7 - 3))
lastBusDay = lastBusDay - shift
Run Code Online (Sandbox Code Playgroud)

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

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

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


Max*_*aev 6

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)
Run Code Online (Sandbox Code Playgroud)

在英国,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)
Run Code Online (Sandbox Code Playgroud)

免责声明:我是时间表的作者。


ZdP*_*ter 6

如果有人正在寻找尊重假期的解决方案(没有像 Pandas 这样的大型图书馆),试试这个功能:

import holidays
import datetime


def previous_working_day(check_day_, holidays=holidays.US()):
    offset = max(1, (check_day_.weekday() + 6) % 7 - 3)
    most_recent = check_day_ - datetime.timedelta(offset)
    if most_recent not in holidays:
        return most_recent
    else:
        return previous_working_day(most_recent, holidays)

check_day = datetime.date(2020, 12, 28)
previous_working_day(check_day)
Run Code Online (Sandbox Code Playgroud)

产生:

datetime.date(2020, 12, 24)
Run Code Online (Sandbox Code Playgroud)


lak*_*nen 5

如果您想跳过美国假期以及周末,这对我很有用(使用熊猫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
Run Code Online (Sandbox Code Playgroud)

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

result.to_pydatetime().date()
Run Code Online (Sandbox Code Playgroud)