Pandas에서 CustomBusinessHour.rollforward() 메서드를 사용하면 제공된 날짜가 이미 오프셋(업무 시간)에 속해 있지 않은 경우에만 해당 날짜를 다음 오프셋으로 롤포워드할 수 있습니다. 이 기능은 영업일 및 영업 시간 기준으로 타임스탬프를 정규화해야 할 때 매우 유용합니다.
CustomBusinessHour란?
CustomBusinessHour는 Pandas의 DateOffset 서브클래스로, 사용자가 정의한 영업일(weekmask)과 영업 시간(start, end)을 기준으로 시간 오프셋을 계산합니다. 기본값은 월~금요일, 오전 9시부터 오후 5시까지입니다.
구현 단계
먼저 필요한 라이브러리를 임포트합니다.
import pandas as pd
Pandas에서 타임스탬프 객체를 설정합니다.
timestamp = pd.Timestamp('2021-12-20 08:35:10')CustomBusinessHour 오프셋을 생성합니다. weekmask 매개변수로 유효한 영업일을 지정할 수 있습니다. 아래 예제에서는 월, 화, 수, 금요일을 영업일로 설정했습니다.
cbhOffset = pd.tseries.offsets.CustomBusinessHour(n = 5, weekmask = 'Mon Tue Wed Fri')
타임스탬프에 오프셋을 더하고 업데이트된 타임스탬프를 출력합니다.
print("\nUpdated Timestamp...\n", timestamp + cbhOffset)날짜가 오프셋에 있지 않은 경우에만 롤포워드를 수행합니다.
roll = cbhOffset.rollforward(pd.Timestamp('2021-12-30 08:35:10'))결과를 출력합니다.
print("\nRoll forward Result...\n", roll)전체 예제 코드
다음은 지금까지 설명한 내용을 모두 포함한 전체 코드입니다.
import pandas as pd
# Pandas에서 타임스탬프 객체 설정
timestamp = pd.Timestamp('2021-12-20 08:35:10')
# 타임스탬프 출력
print("Timestamp...\n", timestamp)
# CustomBusinessHour 오프셋 생성
# CustomBusinessHour는 DateOffset의 서브클래스
# 유효한 영업일의 weekmask 지정
cbhOffset = pd.tseries.offsets.CustomBusinessHour(n = 5, weekmask = 'Mon Tue Wed Fri')
# CustomBusinessHour 오프셋 출력
print("\nCustomBusinessHour Offset...\n", cbhOffset)
# 타임스탬프에 오프셋을 더하고 업데이트된 타임스탬프 출력
print("\nUpdated Timestamp...\n", timestamp + cbhOffset)
# 오프셋에 있지 않은 경우에만 롤포워드 수행
roll = cbhOffset.rollforward(pd.Timestamp('2021-12-30 08:35:10'))
# 결과 출력
print("\nRoll forward Result...\n", roll)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Timestamp... 2021-12-20 08:35:10 CustomBusinessHour Offset... <5 * CustomBusinessHours: CBH=09:00-17:00> Updated Timestamp... 2021-12-20 14:00:00 Roll forward Result... 2021-12-31 09:00:00
결과 해석
출력 결과를 살펴보면 몇 가지 중요한 동작을 확인할 수 있습니다.
오프셋 추가: '2021-12-20 08:35:10'에 5개의 커스텀 영업시간(CBH=09:00-17:00)을 더하면 '2021-12-20 14:00:00'이 됩니다. 시작 시각이 영업 시작 시간(09:00)보다 이르므로 자동으로 영업 시간 기준으로 계산된 것입니다.
롤포워드: '2021-12-30 08:35:10'은 목요일이며 weekmask에 포함되지 않는 날(목요일 제외됨)이고, 또한 영업 시작 시간보다 이른 시각입니다. 따라서 rollforward() 메서드는 해당 날짜를 다음 유효한 영업 시간인 '2021-12-31 09:00:00'(금요일 오전 9시)으로 롤포워드합니다.