이 글에서는 pandas를 사용해 주어진 DataFrame에 포함된 윤년(leap year)의 총 개수를 구하는 방법을 알아보겠습니다.
문제 정의
연도(year)와 해당 연도의 일수(days)를 담고 있는 DataFrame이 있다고 가정해 보겠습니다.
DataFrame is year days 0 2002 365 1 2004 366 2 2012 366 3 2018 365 4 2020 366
윤년은 2월이 29일까지 있어 한 해가 366일인 해를 의미합니다. 따라서 위 데이터에서 윤년은 2004년, 2012년, 2020년으로 총 3개입니다.
풀이 접근 방법
이 문제는 다음 단계로 해결할 수 있습니다.
먼저 연도와 일수 데이터를 담은 DataFrame을 생성합니다.
윤년 판별 조건을 설정합니다. 즉,
year % 4 == 0(4로 나누어 떨어지는 해)이면서 동시에days == 366(일수가 366일)인 행만 필터링합니다.조건에 맞는 결과 DataFrame의 길이(
len())를 출력하면 윤년의 개수를 얻을 수 있습니다.
조건 필터링 코드
df[(df['year']%4==0) & (df['days']==366)]
전체 예제 코드
아래는 위 접근 방식을 실제로 구현한 전체 코드입니다.
import pandas as pd
data = {'year': [2002, 2004, 2012, 2018, 2020],
'days': [365, 366, 366, 365, 366]}
df = pd.DataFrame(data)
# 4로 나누어 떨어지면서 일수가 366일인 행만 추출
df1 = df[(df['year']%4==0) & (df['days']==366)]
print("Count is", len(df1))실행 결과
Count is 3
추가 설명
여기서 사용한 조건 year % 4 == 0은 간단한 윤년 판별법입니다. 실제 그레고리력 기준으로는 100으로 나누어 떨어지지만 400으로 나누어 떨어지지 않는 해(예: 1900년)는 윤년이 아니므로, 더 정확한 판별이 필요하다면 다음과 같은 조건을 사용할 수 있습니다.
is_leap = (df['year']%4==0) & ((df['year']%100!=0) | (df['year']%400==0)) count = len(df[is_leap & (df['days']==366)])
다만 본 예제처럼 일수(days) 정보가 함께 주어진 경우에는 days == 366 조건만으로도 충분히 정확하게 윤년을 걸러낼 수 있습니다.