🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Pandas 날짜와 시간 데이터 다루기 완벽 가이드 - 슬라이드 1/8
A

AI Generated

2025. 12. 16. · 6 Views

Pandas 날짜와 시간 데이터 다루기 완벽 가이드

데이터 분석에서 필수적인 날짜와 시간 데이터를 Pandas로 효과적으로 다루는 방법을 배웁니다. datetime 타입 이해부터 시계열 데이터 집계까지, 실무에서 바로 활용할 수 있는 기법들을 소개합니다.


목차

  1. datetime_타입_이해하기
  2. to_datetime으로_변환하기
  3. 연월일_추출하기_dt_accessor
  4. 요일_정보_추출하기
  5. 날짜_범위_필터링하기
  6. 시계열_인덱스_설정하기
  7. resample로_기간별_집계하기

1. datetime 타입 이해하기

입사 6개월 차 데이터 분석가 김분석 씨는 오늘도 엑셀 파일을 열어봤습니다. 날짜 컬럼에는 "2024-01-15"라고 적혀 있는데, Pandas로 불러오니까 이상하게 문자열로 인식됩니다.

"이걸 어떻게 날짜로 바꾸지?" 고민하던 그때, 선배 박데이터 씨가 다가왔습니다.

datetime 타입은 Pandas에서 날짜와 시간 정보를 담는 특별한 자료형입니다. 마치 숫자를 int나 float로 구분하듯이, 날짜 데이터도 전용 타입이 필요합니다.

이 타입을 사용하면 날짜 계산, 필터링, 집계가 훨씬 쉬워집니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np

# 데이터프레임 생성
df = pd.DataFrame({
    '날짜': ['2024-01-15', '2024-01-16', '2024-01-17'],
    '매출': [150000, 230000, 180000]
})

# 데이터 타입 확인
print(df.dtypes)
# 날짜     object  <- 문자열로 인식됨
# 매출      int64

# datetime으로 변환
df['날짜'] = pd.to_datetime(df['날짜'])
print(df.dtypes)
# 날짜    datetime64[ns]  <- 날짜 타입으로 변경됨!

김분석 씨는 매일 아침 전날 매출 데이터를 정리합니다. 엑셀에서 CSV 파일로 저장한 데이터를 Pandas로 불러오는 게 일과의 시작입니다.

그런데 오늘은 뭔가 이상합니다. 날짜별로 정렬하려고 하는데 제대로 정렬이 안 됩니다.

"선배님, 이거 왜 이렇게 이상하게 정렬되죠?" 김분석 씨가 물었습니다. 박데이터 씨가 모니터를 들여다보더니 빙그레 웃습니다.

"아, 날짜가 문자열로 저장되어 있어서 그래요." datetime 타입이란 무엇일까요? 쉽게 비유하자면, datetime은 마치 전화번호부와 같습니다. 전화번호를 단순 숫자로 저장하면 010-1234-5678이 10,012,345,678로 인식됩니다.

하지만 전화번호 형식으로 저장하면 제대로 된 의미를 가지게 됩니다. 날짜도 마찬가지입니다.

"2024-01-15"를 단순 문자열이 아닌 날짜 타입으로 저장해야 진짜 날짜로서 기능할 수 있습니다. 왜 datetime 타입이 필요할까요? 날짜를 문자열로 다루던 시절에는 어땠을까요?

개발자들은 날짜 비교를 직접 문자열로 처리해야 했습니다. "2024-01-15"와 "2024-01-16" 중 어느 게 나중인지 판단하려면 복잡한 로직이 필요했습니다.

더 큰 문제는 날짜 계산이었습니다. "오늘부터 7일 전은 언제인가?"라는 간단한 질문에 답하려면 윤년, 월별 일수를 모두 고려해야 했습니다.

datetime의 등장 바로 이런 문제를 해결하기 위해 datetime 타입이 등장했습니다. datetime을 사용하면 날짜 비교가 직관적으로 가능해집니다.

또한 날짜 계산도 간단한 덧셈과 뺄셈으로 처리할 수 있습니다. 무엇보다 월, 일, 요일 같은 정보를 쉽게 추출할 수 있다는 큰 이점이 있습니다.

코드 분석 위의 코드를 한 줄씩 살펴보겠습니다. 먼저 데이터프레임을 생성할 때 날짜를 문자열로 입력했습니다.

이 상태에서 dtypes를 확인하면 '날짜' 컬럼이 object 타입으로 표시됩니다. object는 Pandas에서 문자열을 의미합니다.

다음으로 pd.to_datetime() 함수로 변환하면 datetime64[ns] 타입으로 바뀝니다. 이제 진짜 날짜 데이터가 된 것입니다.

실무 활용 사례 실제 현업에서는 어떻게 활용할까요? 예를 들어 전자상거래 회사에서 주문 데이터를 분석한다고 가정해봅시다.

주문일시, 배송일시, 환불일시 등 모든 시간 정보를 datetime으로 변환하면 평균 배송 소요일, 월별 매출 추이, 요일별 주문 패턴을 쉽게 분석할 수 있습니다. 네이버, 쿠팡 같은 대형 플랫폼에서는 이런 시계열 분석을 필수적으로 사용합니다.

주의사항 하지만 주의할 점도 있습니다. 초보 분석가들이 흔히 하는 실수 중 하나는 날짜 형식이 다양한 데이터를 무작정 변환하려는 것입니다.

"15/01/2024", "2024.01.15", "Jan 15, 2024" 등 형식이 섞여 있으면 변환 오류가 발생할 수 있습니다. 따라서 pd.to_datetime()의 format 매개변수로 명확한 형식을 지정하거나, infer_datetime_format=True 옵션을 사용해야 합니다.

정리 다시 김분석 씨의 이야기로 돌아가 봅시다. 박데이터 씨의 설명을 들은 김분석 씨는 고개를 끄덕였습니다.

"아, 그래서 정렬이 이상했군요!" datetime 타입을 제대로 이해하면 시계열 데이터 분석의 첫걸음을 뗀 것입니다. 여러분도 오늘 배운 내용을 실제 데이터에 적용해 보세요.

실전 팁

💡 - CSV 파일을 읽을 때 parse_dates 매개변수를 사용하면 자동으로 datetime 변환이 가능합니다

  • df.info()로 각 컬럼의 데이터 타입을 한눈에 확인할 수 있습니다

2. to datetime으로 변환하기

김분석 씨는 새로운 프로젝트를 맡았습니다. 그런데 이번 데이터는 날짜 형식이 제각각입니다.

어떤 건 "2024/01/15", 어떤 건 "15-Jan-2024"로 되어 있습니다. "이걸 어떻게 통일하지?" 고민하던 중, 박데이터 씨가 to_datetime() 함수의 강력한 기능을 알려줬습니다.

pd.to_datetime() 함수는 다양한 형식의 날짜 문자열을 자동으로 인식하여 datetime 타입으로 변환해줍니다. 마치 구글 번역기가 여러 언어를 자동으로 인식하듯이, 날짜 형식을 알아서 파악합니다.

복잡한 전처리 없이도 깔끔하게 변환할 수 있습니다.

다음 코드를 살펴봅시다.

import pandas as pd

# 다양한 형식의 날짜 데이터
dates_mixed = pd.Series([
    '2024-01-15',      # ISO 형식
    '15/01/2024',      # 유럽 형식
    'Jan 15, 2024',    # 미국 형식
    '20240115',        # 숫자 형식
])

# 자동 변환 (형식 자동 인식)
converted = pd.to_datetime(dates_mixed, format='mixed')
print(converted)

# 오류 처리: 변환 실패 시 NaT(Not a Time)로 처리
dates_with_error = pd.Series(['2024-01-15', 'invalid', '2024-01-17'])
safe_convert = pd.to_datetime(dates_with_error, errors='coerce')
print(safe_convert)
# [Timestamp('2024-01-15'), NaT, Timestamp('2024-01-17')]

김분석 씨가 받은 데이터는 지저분했습니다. 여러 부서에서 취합한 자료라 날짜 형식이 통일되지 않았습니다.

영업팀은 "2024/01/15" 형식을, 마케팅팀은 "Jan 15, 2024" 형식을 사용했습니다. 심지어 해외 지사 데이터는 "15-01-2024"로 되어 있었습니다.

"이거 하나하나 수작업으로 바꿔야 하나..." 한숨을 쉬던 김분석 씨에게 박데이터 씨가 말했습니다. "to_datetime() 함수 하나면 충분해요." to_datetime 함수란? 쉽게 비유하자면, to_datetime은 마치 만능 어댑터와 같습니다.

여행 갈 때 나라마다 다른 콘센트 모양 때문에 어댑터를 챙기죠? 각 나라의 콘센트에 맞춰 자동으로 변환해주는 것처럼, to_datetime도 다양한 날짜 형식을 표준 datetime 타입으로 자동 변환해줍니다.

왜 to_datetime이 필요한가? 날짜 변환을 수동으로 하던 시절에는 어땠을까요? 개발자들은 정규표현식을 사용해서 날짜 패턴을 일일이 찾아내야 했습니다.

"/"로 구분된 건지, "-"로 구분된 건지, 연도가 앞에 오는지 뒤에 오는지 모두 확인해야 했습니다. 더 큰 문제는 예외 처리였습니다.

잘못된 날짜 데이터가 하나라도 있으면 전체 프로그램이 멈춰버렸습니다. to_datetime의 강력함 바로 이런 문제를 해결하기 위해 to_datetime 함수가 제공됩니다.

to_datetime을 사용하면 형식 자동 인식이 가능해집니다. 또한 errors 매개변수로 오류 처리 전략을 선택할 수 있습니다.

무엇보다 대용량 데이터도 빠르게 변환할 수 있다는 큰 이점이 있습니다. 코드 분석 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 네 가지 다른 형식의 날짜 문자열을 시리즈로 만들었습니다. format='mixed'를 지정하면 Pandas가 각 항목의 형식을 자동으로 판단합니다.

이 부분이 핵심입니다. 다음으로 오류 처리 예제에서는 errors='coerce' 옵션을 사용했습니다.

이렇게 하면 변환할 수 없는 값은 NaT(Not a Time)로 바뀌어 전체 작업이 중단되지 않습니다. 실무 활용 사례 실제 현업에서는 어떻게 활용할까요?

예를 들어 글로벌 기업에서 각국 지사의 판매 데이터를 통합한다고 가정해봅시다. 미국 지사는 MM/DD/YYYY 형식을, 유럽 지사는 DD/MM/YYYY 형식을 사용합니다.

to_datetime의 dayfirst 매개변수를 적절히 활용하면 각 지역의 데이터를 올바르게 변환할 수 있습니다. 삼성, LG 같은 글로벌 기업에서는 이런 다국적 데이터 통합이 일상입니다.

주의사항 하지만 주의할 점도 있습니다. 초보 분석가들이 흔히 하는 실수 중 하나는 format='mixed'를 남용하는 것입니다.

형식이 명확하다면 format 매개변수로 정확한 형식을 지정하는 게 더 빠르고 안전합니다. 예를 들어 format='%Y-%m-%d'로 지정하면 처리 속도가 훨씬 빨라집니다.

따라서 데이터 형식을 먼저 파악한 후 적절한 옵션을 선택해야 합니다. 정리 다시 김분석 씨의 이야기로 돌아가 봅시다.

박데이터 씨의 설명을 들은 김분석 씨는 감탄했습니다. "와, 정말 간단하네요!" to_datetime을 제대로 활용하면 복잡한 날짜 전처리 작업을 몇 줄로 끝낼 수 있습니다.

여러분도 오늘 배운 내용을 지저분한 날짜 데이터에 적용해 보세요.

실전 팁

💡 - format 매개변수에 정확한 형식을 지정하면 변환 속도가 10배 이상 빨라집니다

  • utc=True 옵션으로 UTC 시간대로 통일할 수 있습니다

3. 연월일 추출하기 dt accessor

변환은 성공했습니다. 이제 김분석 씨는 월별 매출을 집계해야 합니다.

그런데 datetime 컬럼에서 어떻게 월만 뽑아낼까요? "선배님, 날짜에서 연도랑 월만 따로 가져올 수 있나요?" 박데이터 씨가 대답합니다.

"dt accessor를 사용하면 됩니다."

dt accessor는 datetime 컬럼에서 연, 월, 일 같은 구성 요소를 쉽게 추출할 수 있게 해주는 도구입니다. 마치 주소에서 시, 구, 동을 분리하듯이, 날짜에서 원하는 부분만 꺼낼 수 있습니다.

추출한 값으로 새로운 컬럼을 만들어 분석에 활용합니다.

다음 코드를 살펴봅시다.

import pandas as pd

# 날짜 데이터 준비
df = pd.DataFrame({
    '주문일': pd.to_datetime(['2024-01-15', '2024-02-20', '2024-03-10']),
    '금액': [50000, 70000, 60000]
})

# dt accessor로 연/월/일 추출
df['연도'] = df['주문일'].dt.year
df['월'] = df['주문일'].dt.month
df['일'] = df['주문일'].dt.day

# 날짜 이름도 추출 가능
df['월_이름'] = df['주문일'].dt.month_name()  # January, February...

print(df)
#      주문일    금액  연도  월  일    월_이름
# 2024-01-15  50000  2024   1  15  January

김분석 씨는 분기별 매출 보고서를 작성해야 합니다. 상사가 "1분기, 2분기별로 나눠서 보고해주세요"라고 했는데, 데이터에는 그냥 주문일만 있습니다.

어떻게 날짜에서 월을 뽑아서 분기를 계산할까요? 막막해하던 그때, 박데이터 씨가 자리로 다가왔습니다.

"dt accessor라는 걸 알려드릴게요. 이거 하나면 날짜를 자유자재로 다룰 수 있어요." dt accessor란 무엇인가? 쉽게 비유하자면, dt accessor는 마치 스위스 아미 나이프와 같습니다.

하나의 도구에 여러 기능이 담겨 있죠? 가위, 칼, 드라이버가 모두 접혀 있듯이, dt에도 year, month, day, hour 같은 다양한 속성이 들어 있습니다.

필요한 걸 꺼내 쓰기만 하면 됩니다. 왜 dt accessor가 필요한가? dt accessor가 없던 시절에는 어땠을까요?

개발자들은 문자열 처리 함수로 날짜를 쪼개야 했습니다. "2024-01-15"에서 "01"만 추출하려면 split()이나 슬라이싱을 사용해야 했습니다.

코드가 길어지고, 실수하기도 쉬웠습니다. 더 큰 문제는 가독성이었습니다.

코드를 보는 사람이 "이게 월을 추출하는 거구나"라고 알아채기 어려웠습니다. dt accessor의 편리함 바로 이런 문제를 해결하기 위해 dt accessor가 제공됩니다.

dt accessor를 사용하면 직관적인 속성명으로 원하는 값을 추출할 수 있습니다. 또한 코드가 간결하고 읽기 쉬워집니다.

무엇보다 datetime 타입에만 작용하므로 타입 안정성이 보장된다는 큰 이점이 있습니다. 코드 분석 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 datetime 타입의 '주문일' 컬럼이 있는 데이터프레임을 만들었습니다. 다음으로 .dt.year를 사용하면 연도만 추출됩니다.

이 부분이 핵심입니다. .dt.month, .dt.day도 같은 방식으로 작동합니다.

심지어 .dt.month_name()을 사용하면 "January" 같은 월 이름도 얻을 수 있습니다. 추출한 값은 새로운 컬럼으로 저장하여 이후 분석에 활용합니다.

실무 활용 사례 실제 현업에서는 어떻게 활용할까요? 예를 들어 배달 앱 회사에서 주문 데이터를 분석한다고 가정해봅시다.

주문 시간에서 시간대(hour)를 추출하면 점심시간 피크, 저녁시간 피크를 파악할 수 있습니다. 또 월(month)을 추출하면 계절별 메뉴 선호도를 분석할 수 있습니다.

배민, 쿠팡이츠 같은 회사에서는 이런 시간대별, 월별 분석이 매우 중요합니다. 주의사항 하지만 주의할 점도 있습니다.

초보 분석가들이 흔히 하는 실수 중 하나는 dt accessor를 문자열 컬럼에 사용하려는 것입니다. dt는 datetime 타입에만 사용할 수 있습니다.

만약 컬럼이 문자열이라면 먼저 to_datetime()으로 변환해야 합니다. 따라서 항상 df.dtypes로 타입을 확인한 후 dt accessor를 사용해야 합니다.

정리 다시 김분석 씨의 이야기로 돌아가 봅시다. 박데이터 씨의 설명을 들은 김분석 씨는 신기해했습니다.

"이렇게 간단하게 월을 뽑을 수 있다니!" dt accessor를 제대로 활용하면 날짜 기반 집계와 분석이 훨씬 쉬워집니다. 여러분도 오늘 배운 내용을 월별, 분기별 리포트에 적용해 보세요.

실전 팁

💡 - .dt.quarter로 분기(1~4)를 바로 추출할 수 있습니다

  • .dt.dayofweek는 0(월요일)~6(일요일)로 요일을 숫자로 반환합니다

4. 요일 정보 추출하기

이번에는 요일별 패턴 분석이 필요합니다. 김분석 씨의 상사가 "주말이랑 평일 매출이 어떻게 다른지 보고서 작성해줘"라고 했습니다.

날짜에서 요일을 어떻게 알아낼까요? 또 월요일인지 일요일인지 어떻게 구분할까요?

박데이터 씨가 요일 추출 방법을 알려줍니다.

요일 정보 추출은 dt accessor의 dayofweek, day_name() 같은 속성으로 가능합니다. 마치 달력을 보고 오늘이 무슨 요일인지 확인하듯이, 코드로도 자동으로 요일을 파악할 수 있습니다.

이를 활용하면 주중과 주말을 구분하여 분석할 수 있습니다.

다음 코드를 살펴봅시다.

import pandas as pd

# 날짜 데이터 준비
df = pd.DataFrame({
    '날짜': pd.to_datetime(['2024-01-15', '2024-01-16', '2024-01-20', '2024-01-21']),
    '매출': [100000, 120000, 250000, 280000]
})

# 요일 숫자로 추출 (0=월요일, 6=일요일)
df['요일번호'] = df['날짜'].dt.dayofweek

# 요일 이름으로 추출
df['요일'] = df['날짜'].dt.day_name()

# 주중/주말 구분
df['주중여부'] = df['요일번호'] < 5  # 0~4는 평일, 5~6은 주말
df['구분'] = df['주중여부'].map({True: '평일', False: '주말'})

print(df)

김분석 씨는 흥미로운 패턴을 발견했습니다. 어떤 날은 매출이 유독 높고, 어떤 날은 낮습니다.

혹시 요일과 관련이 있을까요? 금요일 저녁에 사람들이 더 많이 주문하는 건 아닐까요?

"선배님, 날짜에서 요일을 어떻게 알아내나요?" 김분석 씨가 물었습니다. 박데이터 씨가 밝게 웃으며 답했습니다.

"dt accessor에 요일 관련 속성들이 다 있어요." 요일 추출이란? 쉽게 비유하자면, 요일 추출은 마치 생일로 별자리를 찾는 것과 같습니다. 생년월일만 알면 자동으로 "당신은 물병자리입니다"라고 알려주죠?

마찬가지로 날짜만 있으면 Pandas가 자동으로 "이 날은 월요일입니다"라고 계산해줍니다. 우리는 달력을 펼쳐볼 필요가 없습니다.

왜 요일 정보가 필요한가? 요일 정보 없이 분석하던 시절에는 어땠을까요? 개발자들은 수동으로 달력을 보면서 각 날짜가 무슨 요일인지 확인해야 했습니다.

데이터가 많아지면 이건 불가능한 작업이었습니다. 더 큰 문제는 주중과 주말을 구분하는 것이었습니다.

평일 패턴과 주말 패턴을 비교하려면 일일이 라벨링을 해야 했습니다. dt accessor의 요일 기능 바로 이런 문제를 해결하기 위해 요일 관련 속성들이 제공됩니다.

dt.dayofweek를 사용하면 숫자로 요일을 얻을 수 있습니다. 또한 dt.day_name()으로 "Monday" 같은 요일 이름도 얻을 수 있습니다.

무엇보다 이 값들로 평일/주말을 구분하는 새로운 컬럼을 만들 수 있다는 큰 이점이 있습니다. 코드 분석 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 .dt.dayofweek로 요일을 숫자로 추출했습니다. 0은 월요일, 6은 일요일입니다.

이 부분이 핵심입니다. 다음으로 .dt.day_name()으로 요일 이름을 얻었습니다.

그리고 요일번호가 5 미만인지 체크하여 평일 여부를 판단했습니다. 마지막으로 map() 함수로 True/False를 "평일"/"주말"로 바꿔 더 읽기 쉽게 만들었습니다.

실무 활용 사례 실제 현업에서는 어떻게 활용할까요? 예를 들어 카페 체인에서 매출 데이터를 분석한다고 가정해봅시다.

요일별로 집계하면 "월요일 아침에 아메리카노가 가장 많이 팔린다", "금요일 저녁에 디저트 매출이 높다" 같은 인사이트를 발견할 수 있습니다. 스타벅스, 이디야 같은 프랜차이즈에서는 이런 요일별 분석으로 재고 관리와 인력 배치를 최적화합니다.

주의사항 하지만 주의할 점도 있습니다. 초보 분석가들이 흔히 하는 실수 중 하나는 dayofweek와 weekday를 혼동하는 것입니다.

사실 둘 다 같은 결과를 반환하지만, dayofweek가 더 명확한 이름입니다. 또한 day_name()은 영어로 반환되므로 한글이 필요하면 별도로 매핑해야 합니다.

따라서 요일 이름을 사용할 때는 언어 설정을 고려해야 합니다. 정리 다시 김분석 씨의 이야기로 돌아가 봅시다.

박데이터 씨의 설명을 들은 김분석 씨는 바로 분석에 착수했습니다. "주말 매출이 평일보다 2배 높네요!" 요일 정보를 제대로 활용하면 시간 패턴의 숨은 인사이트를 발견할 수 있습니다.

여러분도 오늘 배운 내용을 주중/주말 비교 분석에 적용해 보세요.

실전 팁

💡 - dt.is_month_end, dt.is_month_start로 월초/월말을 체크할 수 있습니다

  • 한글 요일이 필요하면 {0: '월', 1: '화', ...} 딕셔너리로 매핑하세요

5. 날짜 범위 필터링하기

김분석 씨는 이번 분기 데이터만 따로 보고 싶습니다. 전체 데이터는 작년부터 지금까지인데, 2024년 1월부터 3월까지만 추출하려면 어떻게 해야 할까요?

"선배님, 특정 기간의 데이터만 가져올 수 있나요?" 박데이터 씨가 날짜 필터링 방법을 보여줍니다.

날짜 범위 필터링은 datetime 컬럼에 부등호 연산자를 사용하여 특정 기간의 데이터만 선택하는 기법입니다. 마치 책에서 특정 페이지만 펼쳐보듯이, 전체 데이터에서 원하는 날짜 구간만 추출할 수 있습니다.

분기별, 월별 분석에 필수적인 기능입니다.

다음 코드를 살펴봅시다.

import pandas as pd

# 샘플 데이터 생성
df = pd.DataFrame({
    '날짜': pd.to_datetime([
        '2023-12-15', '2024-01-10', '2024-02-20',
        '2024-03-15', '2024-04-05'
    ]),
    '매출': [100, 150, 200, 180, 220]
})

# 특정 날짜 이후 필터링
after_2024 = df[df['날짜'] >= '2024-01-01']

# 날짜 범위 필터링 (2024년 1분기)
q1_2024 = df[(df['날짜'] >= '2024-01-01') & (df['날짜'] <= '2024-03-31')]

# between 메서드 사용 (더 간결함)
q1_2024_alt = df[df['날짜'].between('2024-01-01', '2024-03-31')]

print(q1_2024)

김분석 씨는 분기 보고서를 작성하고 있습니다. 그런데 데이터에는 작년부터 올해까지 모든 기록이 섞여 있습니다.

1분기 데이터만 따로 추출해서 집계해야 하는데, 어떻게 해야 할까요? "이거 일일이 날짜를 확인하면서 지워야 하나요?" 걱정하는 김분석 씨에게 박데이터 씨가 말했습니다.

"아니요, datetime이면 부등호로 비교할 수 있어요." 날짜 필터링이란? 쉽게 비유하자면, 날짜 필터링은 마치 서랍에서 특정 연도의 영수증만 찾는 것과 같습니다. 2024년 영수증만 필요하다면 2023년 것은 건너뛰고, 2024년 것만 꺼내면 됩니다.

Pandas도 마찬가지로 조건에 맞는 날짜의 행만 골라낼 수 있습니다. 왜 날짜 필터링이 필요한가? 날짜 필터링 없이 분석하던 시절에는 어땠을까요?

개발자들은 반복문으로 각 행을 확인하며 날짜를 체크해야 했습니다. "이 날짜가 2024년 1월 1일 이후인가?"를 일일이 판단하는 코드를 작성했습니다.

코드가 길어지고, 실수하기도 쉬웠습니다. 더 큰 문제는 성능이었습니다.

대용량 데이터에서는 반복문이 매우 느렸습니다. Pandas의 벡터화된 필터링 바로 이런 문제를 해결하기 위해 벡터화된 날짜 비교가 제공됩니다.

datetime 타입이면 문자열로 비교가 가능해집니다. 또한 & 연산자로 여러 조건을 결합할 수 있습니다.

무엇보다 between() 메서드로 더 간결하게 범위를 지정할 수 있다는 큰 이점이 있습니다. 코드 분석 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 >= 연산자로 2024년 1월 1일 이후의 데이터만 선택했습니다. datetime 타입이므로 문자열과 직접 비교가 가능합니다.

다음으로 & 연산자로 시작일과 종료일 조건을 결합했습니다. 이 부분이 핵심입니다.

괄호를 꼭 써야 한다는 점을 주의하세요. 마지막으로 between() 메서드를 사용하면 더 간결하게 같은 결과를 얻을 수 있습니다.

실무 활용 사례 실제 현업에서는 어떻게 활용할까요? 예를 들어 금융 회사에서 분기별 실적을 집계한다고 가정해봅시다.

전체 거래 내역에서 1분기, 2분기, 3분기, 4분기를 각각 필터링하여 분기별 보고서를 자동으로 생성할 수 있습니다. 또한 특정 프로모션 기간의 효과를 분석하려면 해당 기간만 추출하여 이전/이후와 비교합니다.

KB국민은행, 신한은행 같은 금융권에서는 이런 기간별 집계가 일상적입니다. 주의사항 하지만 주의할 점도 있습니다.

초보 분석가들이 흔히 하는 실수 중 하나는 & 연산자 사용 시 괄호를 빼먹는 것입니다. df[df['날짜'] >= '2024-01-01' & df['날짜'] <= '2024-03-31']처럼 쓰면 연산자 우선순위 때문에 오류가 발생합니다.

각 조건을 반드시 괄호로 감싸야 합니다. 따라서 복잡한 조건일수록 between()을 사용하는 게 안전합니다.

정리 다시 김분석 씨의 이야기로 돌아가 봅시다. 박데이터 씨의 설명을 들은 김분석 씨는 빠르게 1분기 데이터를 추출했습니다.

"와, 정말 쉽네요!" 날짜 필터링을 제대로 활용하면 원하는 기간의 데이터를 자유롭게 분석할 수 있습니다. 여러분도 오늘 배운 내용을 분기별, 월별 리포트에 적용해 보세요.

실전 팁

💡 - loc를 함께 사용하면 특정 컬럼만 선택하면서 필터링할 수 있습니다

  • date_range()로 날짜 범위를 미리 생성해두면 반복 작업이 편해집니다

6. 시계열 인덱스 설정하기

김분석 씨는 시계열 데이터 분석에 도전합니다. 박데이터 씨가 "시계열 분석을 제대로 하려면 날짜를 인덱스로 설정해야 해요"라고 조언했습니다.

인덱스? 그게 뭔가요?

왜 날짜를 인덱스로 만들어야 할까요? 시계열 인덱스의 강력한 기능을 알아봅시다.

시계열 인덱스는 데이터프레임의 인덱스를 datetime 타입으로 설정하는 것입니다. 마치 책의 목차가 페이지 번호 대신 날짜로 되어 있는 것처럼, 행을 날짜로 식별할 수 있게 됩니다.

이렇게 하면 날짜 기반 슬라이싱, 리샘플링 같은 강력한 기능을 사용할 수 있습니다.

다음 코드를 살펴봅시다.

import pandas as pd

# 날짜 데이터 생성
df = pd.DataFrame({
    '날짜': pd.date_range('2024-01-01', periods=10, freq='D'),
    '매출': [100, 120, 110, 130, 140, 135, 150, 145, 160, 155]
})

print("Before:", df.index)  # RangeIndex(start=0, stop=10, step=1)

# 날짜를 인덱스로 설정
df = df.set_index('날짜')

print("After:", df.index)  # DatetimeIndex(['2024-01-01', ...])

# 시계열 인덱스의 강력함: 문자열로 슬라이싱
jan_5_to_8 = df['2024-01-05':'2024-01-08']

# 월 단위로 선택
jan_data = df['2024-01']  # 1월 전체 데이터

print(jan_5_to_8)

김분석 씨는 궁금했습니다. 지금까지는 날짜를 그냥 컬럼으로 사용했는데, 왜 인덱스로 바꿔야 할까요?

박데이터 씨가 설명을 시작했습니다. "인덱스는 행을 식별하는 특별한 컬럼이에요.

날짜를 인덱스로 만들면 마법 같은 일들이 일어나죠." 김분석 씨는 반신반의하며 코드를 따라 쳤습니다. 과연 무슨 마법이 일어날까요?

시계열 인덱스란? 쉽게 비유하자면, 시계열 인덱스는 마치 일기장의 날짜와 같습니다. 일기장은 페이지 번호 대신 날짜로 각 페이지를 구분합니다.

"1월 15일 일기를 보자"라고 하면 바로 그 날짜로 펼칠 수 있죠? 데이터프레임도 마찬가지로 날짜를 인덱스로 만들면 "2024년 1월 데이터를 보자"라고 직관적으로 선택할 수 있습니다.

왜 시계열 인덱스가 필요한가? 날짜를 일반 컬럼으로만 사용하던 시절에는 어땠을까요? 개발자들은 특정 기간의 데이터를 선택하려면 복잡한 필터링 조건을 작성해야 했습니다.

또한 월별, 연도별 집계를 하려면 groupby를 사용해야 했습니다. 코드가 길어지고, 의도를 파악하기도 어려웠습니다.

더 큰 문제는 resample 같은 시계열 전용 기능을 사용할 수 없다는 것이었습니다. 시계열 인덱스의 마법 바로 이런 문제를 해결하기 위해 시계열 인덱스가 제공됩니다.

시계열 인덱스를 설정하면 문자열로 날짜 범위를 슬라이싱할 수 있습니다. 또한 '2024-01'처럼 부분 문자열로 전체 월을 선택할 수 있습니다.

무엇보다 resample, shift, rolling 같은 강력한 시계열 메서드를 사용할 수 있다는 큰 이점이 있습니다. 코드 분석 위의 코드를 한 줄씩 살펴보겠습니다.

먼저 date_range()로 연속된 날짜를 생성했습니다. 처음에는 일반적인 0, 1, 2 같은 정수 인덱스를 가지고 있습니다.

다음으로 set_index('날짜')를 호출하면 날짜 컬럼이 인덱스로 바뀝니다. 이 부분이 핵심입니다.

이제 DatetimeIndex 타입의 인덱스를 가지게 됩니다. 그 후 '2024-01-05':'2024-01-08'처럼 문자열로 슬라이싱할 수 있습니다.

심지어 '2024-01'로 1월 전체를 선택하는 것도 가능합니다. 실무 활용 사례 실제 현업에서는 어떻게 활용할까요?

예를 들어 IoT 센서 데이터를 분석하는 회사에서 온도, 습도 데이터를 수집한다고 가정해봅시다. 시간을 인덱스로 설정하면 "오전 9시부터 12시까지", "2024년 1월 전체" 같은 범위를 매우 쉽게 선택할 수 있습니다.

또한 1시간 단위, 1일 단위로 평균을 구하는 resample도 사용할 수 있습니다. 삼성전자, LG전자의 스마트홈 부서에서는 이런 센서 데이터 분석이 핵심입니다.

주의사항 하지만 주의할 점도 있습니다. 초보 분석가들이 흔히 하는 실수 중 하나는 set_index() 후에 원본 데이터프레임이 바뀌지 않는다는 걸 깜빡하는 것입니다.

set_index()는 새로운 데이터프레임을 반환하므로 df = df.set_index('날짜')처럼 재할당해야 합니다. 또는 inplace=True 매개변수를 사용할 수 있습니다.

따라서 항상 반환값을 받거나 inplace 옵션을 사용해야 합니다. 정리 다시 김분석 씨의 이야기로 돌아가 봅시다.

박데이터 씨의 설명을 들은 김분석 씨는 감탄했습니다. "와, 정말 편하네요!" 시계열 인덱스를 제대로 설정하면 날짜 기반 분석이 훨씬 직관적이고 강력해집니다.

여러분도 오늘 배운 내용을 시계열 데이터에 적용해 보세요.

실전 팁

💡 - reset_index()로 인덱스를 다시 일반 컬럼으로 되돌릴 수 있습니다

  • sort_index()로 날짜순으로 정렬하면 시계열 분석이 더 정확해집니다

7. resample로 기간별 집계하기

드디어 마지막 단계입니다. 김분석 씨는 일별 데이터를 주별, 월별로 집계해야 합니다.

"일일이 groupby로 묶어야 하나요?" 박데이터 씨가 웃으며 말합니다. "시계열 인덱스가 있다면 resample이 훨씬 편해요."

**resample()**은 시계열 데이터를 특정 주기로 재샘플링하여 집계하는 강력한 메서드입니다. 마치 확대경으로 보던 걸 망원경으로 바꿔 멀리서 보듯이, 일별 데이터를 주별, 월별로 축소하여 전체 흐름을 파악할 수 있습니다.

시계열 분석의 핵심 도구입니다.

다음 코드를 살펴봅시다.

import pandas as pd
import numpy as np

# 일별 데이터 생성 (30일)
df = pd.DataFrame({
    '날짜': pd.date_range('2024-01-01', periods=30, freq='D'),
    '매출': np.random.randint(100, 200, 30)
})
df = df.set_index('날짜')

# 주별 집계 (일요일 기준)
weekly = df.resample('W').sum()
print("주별 합계:\n", weekly.head())

# 월별 평균
monthly_avg = df.resample('M').mean()
print("월별 평균:\n", monthly_avg)

# 다양한 주기: 'D'(일), 'W'(주), 'M'(월), 'Q'(분기), 'Y'(연)
# 여러 집계 함수: sum(), mean(), max(), min(), count()

김분석 씨는 30일치 일별 매출 데이터를 받았습니다. 하지만 보고서에는 주별 매출을 적어야 합니다.

어떻게 7일씩 묶어서 합계를 구할까요? groupby로 주차를 계산해서 묶어야 할까요?

"선배님, 일별 데이터를 주별로 바꾸려면 어떻게 해야 하죠?" 김분석 씨가 물었습니다. 박데이터 씨가 자신 있게 답했습니다.

"resample 하나면 끝이에요." resample이란? 쉽게 비유하자면, resample은 마치 사진 해상도를 조정하는 것과 같습니다. 고해상도 사진을 저해상도로 줄이면 세부 사항은 사라지지만 전체 모습은 더 한눈에 들어옵니다.

마찬가지로 일별 데이터를 월별로 resample하면 일일 변동은 사라지지만 전체 추세가 명확해집니다. 왜 resample이 필요한가? resample 없이 집계하던 시절에는 어땠을까요?

개발자들은 먼저 날짜에서 주차나 월을 추출해야 했습니다. 그다음 groupby로 그룹을 만들고, sum이나 mean 같은 집계 함수를 적용했습니다.

코드가 여러 줄로 늘어나고, 주차 계산이 복잡했습니다. 더 큰 문제는 분기별, 반기별 같은 특수한 주기는 직접 구현해야 한다는 것이었습니다.

resample의 강력함 바로 이런 문제를 해결하기 위해 resample 메서드가 제공됩니다. resample을 사용하면 한 줄로 원하는 주기로 재집계할 수 있습니다.

또한 'W', 'M', 'Q', 'Y' 같은 직관적인 문자열로 주기를 지정할 수 있습니다. 무엇보다 시계열 데이터 특성에 맞게 최적화되어 있어 빠르고 정확하다는 큰 이점이 있습니다.

코드 분석 위의 코드를 한 줄씩 살펴보겠습니다. 먼저 date_range로 30일치 연속 날짜를 생성하고, set_index로 시계열 인덱스를 설정했습니다.

인덱스가 DatetimeIndex여야 resample을 사용할 수 있습니다. 다음으로 resample('W')를 호출하면 주별로 그룹화됩니다.

이 부분이 핵심입니다. 'W'는 주(Week)를 의미하며, 기본적으로 일요일을 기준으로 합니다.

그 뒤에 .sum()을 붙이면 각 주의 합계가 계산됩니다. resample('M').mean()은 월별 평균을 구합니다.

실무 활용 사례 실제 현업에서는 어떻게 활용할까요? 예를 들어 주식 거래 플랫폼에서 거래량 데이터를 분석한다고 가정해봅시다.

분 단위로 쌓이는 거래 데이터를 시간 단위, 일 단위로 resample하면 트레이딩 패턴을 파악할 수 있습니다. 또한 에너지 회사에서 전력 사용량을 분석할 때 15분 단위 데이터를 시간 단위, 일 단위로 집계하여 피크 타임을 찾아냅니다.

한국전력, 증권사의 데이터 분석팀에서는 resample이 일상적인 도구입니다. 주의사항 하지만 주의할 점도 있습니다.

초보 분석가들이 흔히 하는 실수 중 하나는 시계열 인덱스 없이 resample을 사용하려는 것입니다. resample은 DatetimeIndex가 필수입니다.

날짜가 일반 컬럼이면 먼저 set_index()로 인덱스로 만들어야 합니다. 또한 resample 후에는 집계 함수를 꼭 붙여야 결과가 나옵니다.

따라서 resample('W') 후에 반드시 .sum(), .mean() 같은 집계를 추가해야 합니다. 정리 다시 김분석 씨의 이야기로 돌아가 봅시다.

박데이터 씨의 설명을 들은 김분석 씨는 감격했습니다. "이렇게 간단하게 주별 집계를 할 수 있다니!" resample을 제대로 활용하면 복잡한 시계열 데이터도 원하는 주기로 자유롭게 집계할 수 있습니다.

여러분도 오늘 배운 내용을 실전 데이터 분석에 적용해 보세요. 에필로그 김분석 씨는 이제 날짜와 시간 데이터를 자신 있게 다룰 수 있게 되었습니다.

datetime 타입 이해부터 시작해서, 변환, 추출, 필터링, 인덱스 설정, 그리고 resample까지. 처음에는 어렵게 느껴졌던 시계열 분석이 이제는 손에 익었습니다.

박데이터 씨가 김분석 씨의 어깨를 두드렸습니다. "이제 진짜 데이터 분석가가 된 것 같네요." 김분석 씨는 뿌듯하게 웃으며 고개를 끄덕였습니다.

여러분도 오늘 배운 내용으로 시계열 데이터 분석의 세계에 자신 있게 발을 들여놓으세요.

실전 팁

💡 - resample의 label과 closed 매개변수로 구간 경계를 세밀하게 제어할 수 있습니다

  • asfreq() 메서드는 집계 없이 주기만 변경할 때 유용합니다

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Python#Pandas#DateTime#TimeSeries#DataAnalysis

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.