개요
데이터 분석이나 프로젝트 일정 관리를 하다 보면 특정 기간 동안의 영업일(평일) 수가 몇 일인지 계산해야 하는 경우가 자주 발생합니다. 이 글에서는 파이썬의 pandas 라이브러리를 활용해 시작 날짜와 종료 날짜 사이의 총 영업일 수를 구하는 함수를 작성하는 두 가지 방법을 소개합니다.
예를 들어, '2020-01-01'부터 '2020-02-02'까지의 영업일 범위를 생성하면 주말이 제외된 다음과 같은 날짜 목록을 얻을 수 있습니다.
Dates are:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-06',
'2020-01-07', '2020-01-08', '2020-01-09', '2020-01-10',
'2020-01-13', '2020-01-14', '2020-01-15', '2020-01-16',
'2020-01-17', '2020-01-20', '2020-01-21', '2020-01-22',
'2020-01-23', '2020-01-24', '2020-01-27', '2020-01-28',
'2020-01-29', '2020-01-30', '2020-01-31'],
dtype='datetime64[ns]', freq='B')
Total number of days: 23출력 결과에서 볼 수 있듯이 토요일과 일요일은 자동으로 제외되며, 최종적으로 총 23일의 영업일이 계산됩니다.
방법 1: len() 함수로 개수 세기
가장 간단하고 직관적인 방법은 영업일 범위 객체의 길이를 구하는 것입니다. 단계별로 살펴보겠습니다.
business_days()라는 이름의 함수를 정의합니다.pd.bdate_range()함수에 시작일'2020-01-01'과 종료일'2020-02-02'를 인자로 전달하고, 그 결과를dates변수에 저장합니다.
dates = pd.bdate_range('2020-01-01','2020-02-02')len(dates)를 사용해 영업일의 총 개수를 계산합니다.
len(dates)
전체 코드 예제
import pandas as pd
def business_days():
dates = pd.bdate_range('2020-01-01','2020-02-02')
print("Total number of days:", len(dates))
business_days()실행 결과
Total number of days: 23
bdate_range는 business date range의 약자로, 기본적으로 월요일부터 금요일까지만 포함하는 날짜 범위를 생성합니다. 따라서 len() 함수만으로도 손쉽게 영업일 수를 구할 수 있습니다.
방법 2: 반복문으로 개수 세기
두 번째 방법은 for 반복문을 사용해 각 날짜를 하나씩 순회하면서 직접 카운트하는 방식입니다. 알고리즘 학습 관점에서 유용한 접근법입니다.
마찬가지로
business_days()함수를 정의하고,pd.bdate_range()로 영업일 범위를 생성해dates변수에 저장합니다.카운터 변수
count를 0으로 초기화한 뒤,for루프로dates의 모든 값을 순회하면서 매번 1씩 증가시킵니다.
count = 0
for i in dates:
count = count + 1마지막으로
count값을 출력합니다.
전체 코드 예제
import pandas as pd
def business_days():
dates = pd.bdate_range('2020-01-01','2020-02-02')
count = 0
for i in dates:
count = count + 1
print("Total number of days:", count)
business_days()실행 결과
Total number of days: 23
참고: 공휴일까지 제외하려면?
두 방법 모두 주말만 제외하기 때문에 실무에서는 공휴일 처리가 필요할 수 있습니다. 이 경우 pandas.tseries.holiday 모듈 또는 CustomBusinessDay 클래스를 활용하면 국가별 공휴일을 반영한 영업일 계산이 가능합니다.
마무리
pandas의 bdate_range() 함수를 사용하면 시작일과 종료일 사이의 영업일 수를 단 몇 줄의 코드로 계산할 수 있습니다. 코드의 간결성을 중시한다면 len() 방법을, 반복문 로직 연습이나 커스텀 조건 추가가 필요하다면 for 루프 방식을 선택하면 됩니다.