[python] Python에서 가장 최근의 전 영업일

현재 날짜에서 영업일 을 빼야 합니다.

현재 가장 최근 영업일에 항상 실행해야하는 코드가 있습니다. 월요일부터 금요일까지라면 오늘 일 수 있지만 토요일이나 일요일이면 주말 전의 금요일로 다시 설정해야합니다. 나는 현재 이것을하기위한 꽤 투박한 코드가있다.

 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으로 변경합니다.

이것이 성능면에서 더 나을지 정말 모릅니다.


답변

면책 조항 : 저는 저자입니다 …

나는 정확히 이것을 수행하는 패키지를 작성했습니다. 비즈니스 날짜 계산. 사용자 지정 주 지정 및 공휴일을 사용할 수 있습니다.

재무 데이터로 작업하는 동안이 정확한 문제가 있었고 사용 가능한 솔루션을 특별히 쉽게 찾지 못했기 때문에 하나를 작성했습니다.

이것이 다른 사람들에게 유용하기를 바랍니다.

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


답변

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)