我需要从当前日期减去工作日.
我目前有一些代码需要始终在最近的工作日运行.所以今天可能是今天,如果我们是星期一到星期五,但如果是星期六或星期日,那么我需要把它设置回周末前的星期五.我目前有一些非常笨重的代码来做到这一点:
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)
Ali*_* R. 13
如果您愿意安装额外的库,似乎有几种选择.
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html
BusinessHours允许您自定义您的假期列表等,以定义您的工作时间(以及延长工作日).
http://pypi.python.org/pypi/BusinessHours/
小智 9
DISCLAMER:我是作者......
我写了一个包,它完成了这个,业务日期计算.您可以使用自定义周规格和假期.
我在使用财务数据时遇到了这个问题,并且没有找到任何可用的解决方案特别容易,所以我写了一个.
希望这对其他人有用.
https://pypi.python.org/pypi/business_calendar/
也许这段代码可以帮助:
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.
真的不知道这在性能方面是否会更好.
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)
免责声明:我是时间表的作者。
如果有人正在寻找尊重假期的解决方案(没有像 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)
如果您想跳过美国假期以及周末,这对我很有用(使用熊猫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)
归档时间: |
|
查看次数: |
98508 次 |
最近记录: |