현재 날짜에서 영업일 을 빼야 합니다.
현재 가장 최근 영업일에 항상 실행해야하는 코드가 있습니다. 월요일부터 금요일까지라면 오늘 일 수 있지만 토요일이나 일요일이면 주말 전의 금요일로 다시 설정해야합니다. 나는 현재 이것을하기위한 꽤 투박한 코드가있다.
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에게 달력 일이 아닌 평일에 일하도록 말할 수 있습니까?
답변
판다를 사용하세요!
import datetime
# BDay is business day, not birthday...
from pandas.tseries.offsets import BDay
today = datetime.datetime.today()
print(today - BDay(4))
오늘은 9 월 26 일 목요일이므로 다음과 같은 결과를 얻을 수 있습니다.
datetime.datetime(2013, 9, 20, 14, 8, 4, 89761)
답변
추가 라이브러리를 설치하려면 몇 가지 옵션이있는 것 같습니다.
이 게시물은 dateutil로 근무일을 정의하는 방법을 설명합니다 .
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-09/3758.html
BusinessHours를 사용하면 휴일 목록 등을 사용자 정의하여 근무 시간 (및 연장 근무일)을 정의 할 수 있습니다.
http://pypi.python.org/pypi/BusinessHours/
답변
미국 공휴일과 주말을 건너 뛰고 싶다면 이것은 나를 위해 일했습니다 (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
파이썬 날짜 객체로 변환하려면 다음을 수행했습니다.
result.to_pydatetime().date()
답변
이 코드가 도움이 될 수 있습니다.
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으로 변경합니다.
이것이 성능면에서 더 나을지 정말 모릅니다.
답변
면책 조항 : 저는 저자입니다 …
나는 정확히 이것을 수행하는 패키지를 작성했습니다. 비즈니스 날짜 계산. 사용자 지정 주 지정 및 공휴일을 사용할 수 있습니다.
재무 데이터로 작업하는 동안이 정확한 문제가 있었고 사용 가능한 솔루션을 특별히 쉽게 찾지 못했기 때문에 하나를 작성했습니다.
이것이 다른 사람들에게 유용하기를 바랍니다.
답변
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)
면책 조항 : 저는 타임 보드의 작성자입니다.
답변
누군가가 (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)
생성하는 :
datetime.date(2020, 12, 24)