Programing

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

crosscheck 2020. 11. 20. 08:39
반응형

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 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)

추가 라이브러리를 설치하려면 몇 가지 옵션이있는 것 같습니다.

이 게시물은 dateutil로 근무일을 정의하는 방법을 설명합니다 .

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

BusinessHours를 사용하면 휴일 목록 등을 사용자 정의하여 근무 시간 (및 연장 근무일)을 정의 할 수 있습니다.

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


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

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

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

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

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


이 코드가 도움이 될 수 있습니다.

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

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


미국 공휴일과 주말을 건너 뛰고 싶다면 이것은 나를 위해 일했습니다 (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()

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)

면책 조항 : 저는 타임 보드의 작성자입니다.


이것은 물론 공휴일없이 근무일의 생성자에게 줄 것이고 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))

다음과 같은 것을 시도해보십시오.

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

 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 

참고URL : https://stackoverflow.com/questions/2224742/most-recent-previous-business-day-in-python

반응형