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]
})
  1. 주문일을 날짜 타입으로 변환하세요.
  2. 각 주문의 요일 이름을 새 열로 추가하세요.
  3. 월별 총 금액을 구하세요. (힌트: .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()으로 바로 시계열 그래프가 된다.

✍️ 확인 문제

  1. 날짜를 글자가 아니라 날짜 타입으로 바꿔야 하는 이유는 무엇인가요?
  2. 날짜 열에서 요일 이름을 뽑으려면 어떤 코드를 쓰나요?
  3. 날짜를 인덱스로 두면 무엇이 편리해지나요?
마지막 부에서는 글자(텍스트) 데이터를 분석하는 법 — 문자열 처리, 불용어 제거, 토큰화, 워드클라우드를 배웁니다.
👉 18. 텍스트 데이터 분석