17. 날짜와 시간 다루기
🎯 이 장의 목표
- 파이썬과 Pandas에서 날짜·시간을 표현하는 법을 안다
- 글자로 된 날짜를 진짜 날짜 타입으로 바꾼다(
to_datetime) - 날짜에서 연·월·일·요일 등을 뽑아낸다
- 시계열 데이터를 시각화한다
💡 팁
매출, 기온, 방문자 수처럼 시간에 따라 기록된 데이터를 시계열(time series)이라 합니다. 분석에서 아주 흔하므로 날짜 다루기는 꼭 익혀 둘 기술입니다.먼저: 왜 날짜를 특별히 다루나요?
날짜 "2026-06-24"는 그냥 글자처럼 보이지만, 글자로 두면 "이 날의 요일", "한 달 뒤", "두 날짜의 차이" 같은 걸 계산할 수 없습니다. 날짜를 날짜 전용 타입으로 바꾸면 이런 계산이 가능해집니다.
🔑 새 용어 — 시계열(time series)
시간 순서로 기록된 데이터입니다. 날짜·시각이 인덱스나 한 열로 들어 있고, 시간에 따른 변화를 분석합니다. 예: 일별 매출, 시간별 기온.
파이썬의 datetime 맛보기
파이썬에는 날짜를 다루는 datetime 모듈이 기본 내장돼 있습니다.
PYTHON
from datetime import datetime now = datetime.now() # 지금 시각 print(now) print(now.year, now.month, now.day) # 연·월·일 뽑기
실행 결과 (예시):
CODE
2026-06-24 14:30:05.123456 2026 6 24
특정 날짜를 직접 만들 수도 있습니다.
PYTHON
from datetime import datetime d = datetime(2026, 6, 24) print(d)
실행 결과:
CODE
2026-06-24 00:00:00
💡 파이썬 기본 datetime도 알아두면 좋지만, 표 데이터의 날짜는 보통 Pandas로 다루는 게 훨씬 편합니다. 이제 그쪽으로 갑니다.
글자 → 날짜로 변환하기 (to_datetime)
CSV에서 날짜를 읽으면 보통 글자(object)로 들어옵니다. pd.to_datetime으로 진짜 날짜 타입으로 바꿉니다. (12장의 타입 변환과 같은 맥락입니다.)
PYTHON
import pandas as pd df = pd.DataFrame({ "날짜": ["2026-01-15", "2026-02-20", "2026-03-10"], "매출": [100, 150, 130] }) print(df.dtypes) # 날짜가 object(글자)임 df["날짜"] = pd.to_datetime(df["날짜"]) # 날짜 타입으로 변환 print(df.dtypes) # datetime64로 바뀜
실행 결과:
CODE
날짜 object 매출 int64 dtype: object 날짜 datetime64[ns] 매출 int64 dtype: object
🔑 새 용어 — datetime64
Pandas의 날짜/시간 데이터 타입입니다. 이 타입이 되면 연·월·일 추출, 날짜 계산, 시계열 그래프가 모두 가능해집니다. dtype이object(글자)에서datetime64[ns]로 바뀐 것을 확인하세요.
날짜에서 정보 뽑아내기 (.dt)
날짜 타입 열에서는 .dt를 통해 연·월·일·요일 등을 꺼낼 수 있습니다.
PYTHON
import pandas as pd df = pd.DataFrame({"날짜": ["2026-01-15", "2026-02-20", "2026-03-10"]}) df["날짜"] = pd.to_datetime(df["날짜"]) df["연"] = df["날짜"].dt.year df["월"] = df["날짜"].dt.month df["일"] = df["날짜"].dt.day df["요일"] = df["날짜"].dt.day_name() # 요일 이름(영어) print(df)
실행 결과:
CODE
날짜 연 월 일 요일 0 2026-01-15 2026 1 15 Thursday 1 2026-02-20 2026 2 20 Friday 2 2026-03-10 2026 3 10 Tuesday
🔑 새 용어 —.dt접근자
날짜 타입 시리즈에 붙여 날짜의 부분 정보를 꺼내는 도구입니다..dt.year(연),.dt.month(월),.dt.day(일),.dt.dayofweek(요일 번호, 월=0),.dt.day_name()(요일 이름) 등이 있습니다.
이렇게 뽑은 정보는 기능 엔지니어링에 바로 쓰입니다. 예를 들어 "월별 매출"을 구하려면 월 열로 groupby하면 됩니다.
PYTHON
# (df에 매출 열이 있다고 가정) # df.groupby(df["날짜"].dt.month)["매출"].sum()
날짜 계산하기
날짜끼리 빼면 기간이 나오고, 날짜에 기간을 더할 수도 있습니다.
PYTHON
import pandas as pd d1 = pd.to_datetime("2026-06-24") d2 = pd.to_datetime("2026-01-01") print(d1 - d2) # 두 날짜의 차이 print(d2 + pd.Timedelta(days=30)) # 30일 뒤
실행 결과:
CODE
174 days 00:00:00 2026-01-31 00:00:00
🔑 새 용어 — Timedelta
시간의 간격(기간)을 나타내는 타입입니다.pd.Timedelta(days=30)은 "30일"이라는 기간이며, 날짜에 더하거나 뺄 수 있습니다.
날짜를 인덱스로: 시계열의 기본
날짜를 인덱스로 삼으면 기간별 선택·집계가 쉬워집니다.
PYTHON
import pandas as pd df = pd.DataFrame({ "날짜": pd.to_datetime(["2026-01-01", "2026-01-02", "2026-01-03", "2026-02-01", "2026-02-02"]), "매출": [100, 120, 90, 200, 180] }) df = df.set_index("날짜") # 날짜를 인덱스로 (10장의 set_index) print(df) print("---") print(df.loc["2026-01"]) # 1월 데이터만! (연-월로 선택)
실행 결과:
CODE
매출
날짜
2026-01-01 100
2026-01-02 120
2026-01-03 90
2026-02-01 200
2026-02-02 180
---
매출
날짜
2026-01-01 100
2026-01-02 120
2026-01-03 90
💡 팁
날짜를 인덱스로 두면 df.loc["2026-01"]처럼 연-월만으로 그 기간 전체를 골라낼 수 있습니다. 시계열 분석에서 아주 편리합니다.시계열 시각화
날짜를 인덱스로 둔 데이터는 .plot() 한 줄로 시간 흐름 그래프가 됩니다. (15장 Matplotlib 활용.)
PYTHON
import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({ "날짜": pd.to_datetime(["2026-01-01", "2026-01-08", "2026-01-15", "2026-01-22", "2026-01-29"]), "방문자": [120, 150, 130, 180, 200] }) df = df.set_index("날짜") df["방문자"].plot(marker="o", title="Visitors over Time") plt.ylabel("Visitors") plt.show()
나오는 그래프: 가로축이 날짜, 세로축이 방문자 수인 선 그래프가 나옵니다. 날짜 인덱스라 가로축에 날짜가 자동으로 깔끔하게 표시되고, 시간에 따라 방문자가 늘어나는 추세가 보입니다.
🛠 미니 챌린지
PYTHON
import pandas as pd df = pd.DataFrame({ "주문일": ["2026-03-05", "2026-03-18", "2026-04-02", "2026-04-25"], "금액": [50000, 32000, 78000, 41000] })
주문일을 날짜 타입으로 변환하세요.- 각 주문의 월과 요일 이름을 새 열로 추가하세요.
- 월별 총 금액을 구하세요. (힌트:
.dt.month로 groupby)
✅ 미니 챌린지 해설
PYTHON
import pandas as pd df = pd.DataFrame({ "주문일": ["2026-03-05", "2026-03-18", "2026-04-02", "2026-04-25"], "금액": [50000, 32000, 78000, 41000] }) # 1. 날짜 변환 df["주문일"] = pd.to_datetime(df["주문일"]) # 2. 월·요일 추출 df["월"] = df["주문일"].dt.month df["요일"] = df["주문일"].dt.day_name() print(df)
실행 결과:
CODE
주문일 금액 월 요일 0 2026-03-05 50000 3 Thursday 1 2026-03-18 32000 3 Wednesday 2 2026-04-02 78000 4 Thursday 3 2026-04-25 41000 4 Saturday
PYTHON
# 3. 월별 총 금액 print(df.groupby("월")["금액"].sum())
실행 결과:
CODE
월 3 82000 4 119000 Name: 금액, dtype: int64
이 장에서 배운 것
- 시계열은 시간 순으로 기록된 데이터이며, 날짜는 전용 타입으로 다뤄야 계산이 된다.
pd.to_datetime으로 글자(object)를datetime64타입으로 바꾼다..dt.year·.dt.month·.dt.day_name()등으로 날짜 부분 정보를 뽑는다.- 날짜끼리 빼면 기간(Timedelta)이 나오고, 날짜를 인덱스로 두면 기간 선택이 쉽다.
- 날짜 인덱스 데이터는
.plot()으로 바로 시계열 그래프가 된다.
✍️ 확인 문제
- 날짜를 글자가 아니라 날짜 타입으로 바꿔야 하는 이유는 무엇인가요?
- 날짜 열에서 요일 이름을 뽑으려면 어떤 코드를 쓰나요?
- 날짜를 인덱스로 두면 무엇이 편리해지나요?
마지막 부에서는 글자(텍스트) 데이터를 분석하는 법 — 문자열 처리, 불용어 제거, 토큰화, 워드클라우드를 배웁니다.
👉 18. 텍스트 데이터 분석