Pandas & NumPy Academy · 강의

DatetimeIndex와 기간 범위

pd.date_range로 DatetimeIndex를 만들고 문자열 날짜를 파싱하며 시간 열을 인덱스로 설정해 시간 기반으로 접근합니다.

레슨 1/413개 단계

DatetimeIndex와 기간 범위은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

판다스에 특수한 시간 도구가 있는 이유

시계열 데이터에는 날짜를 문자열로 저장하는 것 이상의 작업이 필요합니다. 시간순으로 정렬하고, 날짜 범위를 선택하고, 서로 다른 빈도로 리샘플링하고, 월이나 요일 같은 구성 요소를 추출해야 합니다. 판다스는 DatetimeIndex를 통해 이를 지원합니다. DatetimeIndex는 datetime64 값으로 구성된 인덱스로, 일반 정수 인덱스나 문자열 인덱스에서는 사용할 수 없는 특수한 시간 인식 작업을 가능하게 합니다.

pd.date_range()로 DatetimeIndex 만들기

pd.date_range(start, end, freq)는 일정한 간격으로 떨어진 날짜 시퀀스를 생성합니다. freq 매개변수는 오프셋 별칭을 사용하여 간격을 지정합니다. 'D'는 일, 'h'는 시간, 'ME'는 월말, 'W'는 주, 'YE'는 연말을 의미합니다. end와 periods(타임스탬프 개수) 중 하나만 전달할 수 있으며, 둘 다 전달할 수는 없습니다.

import pandas as pd

# Daily dates for January 2024
dates = pd.date_range(start='2024-01-01', end='2024-01-07', freq='D')
print(dates)
# DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03',
#                '2024-01-04', '2024-01-05', '2024-01-06', '2024-01-07'],
#               dtype='datetime64[ns]', freq='D')

# 12 month-end dates
months = pd.date_range(start='2024-01-31', periods=12, freq='ME')
print(months[:3])

DataFrame에 DatetimeIndex 설정하기

시간 기반 작업을 사용하려면 날짜 열을 pd.to_datetime()으로 datetime64로 변환한 후 set_index()를 사용하여 DataFrame의 인덱스로 설정합니다. 인덱스가 DatetimeIndex가 되면 부분 문자열 인덱싱(df['2024-01']), 날짜 범위 슬라이싱 및 모든 시간 인식 메서드를 사용할 수 있습니다.

df = pd.DataFrame({
    'date':  ['2024-01-01', '2024-01-02', '2024-01-03'],
    'value': [10, 15, 12]
})

df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df)
#             value
# date
# 2024-01-01     10
# 2024-01-02     15
# 2024-01-03     12
print(type(df.index))  # DatetimeIndex

부분 문자열 인덱싱

DatetimeIndex의 가장 편리한 기능 중 하나는 부분 문자열 인덱싱입니다. 부분적인 날짜 문자열을 .loc[]에 전달하면 연도, 월 또는 날짜별로 행을 선택할 수 있습니다. 예를 들어 df.loc['2024-01']은 2024년 1월의 모든 행을 반환하고, df.loc['2024']는 2024년의 모든 행을 반환합니다. 열 값을 명시적으로 비교할 필요가 없습니다.

# Create a larger date-indexed Series
s = pd.Series(
    range(365),
    index=pd.date_range('2024-01-01', periods=365, freq='D')
)

# Select all of January 2024
print(s.loc['2024-01'].shape)  # (31,)

# Select a specific date range
print(s.loc['2024-03-01':'2024-03-07'])

파싱을 위한 pd.to_datetime()

pd.to_datetime()은 문자열, 정수(유닉스 타임스탬프) 또는 형식이 섞인 날짜 열을 datetime64로 변환합니다. 날짜가 표준 형식이 아니라면 format을 전달하여 정확한 패턴을 지정합니다(예: '%d/%m/%Y'). 해석할 수 없는 값을 오류를 발생시키는 대신 NaT(Not a Time)로 변환하려면 errors='coerce'를 사용합니다.

# Parse standard ISO format
print(pd.to_datetime('2024-06-15'))

# Parse non-standard format
print(pd.to_datetime('15/06/2024', format='%d/%m/%Y'))

# Handle mixed/bad data gracefully
mixed = pd.to_datetime(['2024-01-01', 'bad_date', '2024-06-15'],
                       errors='coerce')
print(mixed)  # NaT for 'bad_date'

.dt 접근자로 날짜 구성 요소 다루기

DataFrame의 열(인덱스가 아님)에 datetime64 값이 들어 있으면 .dt 접근자를 통해 해당 열 벡터의 모든 날짜/시간 속성과 메서드를 벡터화된 방식으로 사용할 수 있습니다. 반복문 없이 .dt.year, .dt.month, .dt.day, .dt.day_of_week, .dt.hour 등을 사용하여 값을 추출합니다. 날짜/시간 값이 인덱스에 있으면 df.index.year를 직접 사용합니다.

df_col = pd.DataFrame({'date': pd.date_range('2024-01-01', periods=5, freq='D'),
                       'value': [10, 15, 12, 18, 14]})

df_col['year']  = df_col['date'].dt.year
df_col['month'] = df_col['date'].dt.month
df_col['dow']   = df_col['date'].dt.day_of_week  # 0=Monday
df_col['week']  = df_col['date'].dt.isocalendar().week
print(df_col.head())

pd.period_range()로 기간 범위 만들기

PeriodIndex는 특정 타임스탬프가 아니라 시간의 구간을 나타냅니다. pd.period_range(start, periods, freq)는 월, 분기 또는 연도 단위의 기간을 만듭니다. Period('2024-01', 'M')과 같은 기간은 2024년 1월의 시작일만이 아니라 1월 전체를 나타냅니다. PeriodIndex는 분기나 월 단위로 사고하는 회계 보고에 유용합니다.

# Monthly periods
periods = pd.period_range('2024-01', periods=6, freq='M')
print(periods)
# PeriodIndex(['2024-01', '2024-02', '2024-03',
#              '2024-04', '2024-05', '2024-06'],
#             dtype='period[M]')

# Quarterly periods
quarters = pd.period_range('2024Q1', periods=4, freq='Q')
print(quarters)  # [2024Q1, 2024Q2, 2024Q3, 2024Q4]

타임스탬프와 기간 간 변환

to_period(freq)를 사용하면 DatetimeIndex를 PeriodIndex로 변환할 수 있고, to_timestamp()를 사용하면 다시 되돌릴 수 있습니다. 특정 날짜가 아니라 월이나 분기로 행에 레이블을 지정하려는 경우 기간으로 변환하면 유용합니다. 달력 기준 분석에서 그룹화와 집계를 더 직관적으로 수행할 수 있기 때문입니다.

daily_idx = pd.date_range('2024-01-15', periods=5, freq='D')
print('DatetimeIndex:', daily_idx[:3])

# Convert to monthly periods
monthly_idx = daily_idx.to_period('M')
print('PeriodIndex:', monthly_idx[:3])
# PeriodIndex(['2024-01', '2024-01', ...], dtype='period[M]')

# Convert back to timestamps (start of period)
print(monthly_idx.to_timestamp()[:3])

시간대 처리

실제 시계열에는 시간대 정보가 포함되는 경우가 많습니다. 판다스는 tz_localize()(시간대가 지정되지 않은 타임스탬프에 시간대 연결)와 tz_convert()(시간대 간 변환)를 통해 시간대 인식 DatetimeIndex를 지원합니다. 일광 절약 시간으로 인한 모호성 오류를 피하려면 항상 내부적으로 UTC를 사용하고, 표시할 때만 현지 시간으로 변환하세요.

naive = pd.date_range('2024-01-01', periods=3, freq='D')
print('Naive:', naive.tz)

# Attach timezone (localize)
utc = naive.tz_localize('UTC')
print('UTC:', utc)

# Convert to New York time
ny = utc.tz_convert('America/New_York')
print('NY:', ny[:2])

DatetimeIndex 확인 및 정렬

리샘플링과 슬라이싱 같은 시계열 작업을 수행하려면 DatetimeIndex가 정렬되어 있어야 합니다(단조 증가 순서). df.index.is_monotonic_increasing으로 확인하고, 필요하면 df.sort_index()로 정렬합니다. 정렬되지 않은 DatetimeIndex는 리샘플링과 윈도 함수에서 조용히 오류를 일으키거나 예상치 못한 결과를 낼 수 있습니다.

import numpy as np

df_unsorted = pd.DataFrame(
    {'value': [10, 15, 12]},
    index=pd.to_datetime(['2024-01-03', '2024-01-01', '2024-01-02'])
)
print('Sorted:', df_unsorted.index.is_monotonic_increasing)  # False

df_sorted = df_unsorted.sort_index()
print('After sort:', df_sorted.index.is_monotonic_increasing)  # True
print(df_sorted)

실전 패턴: 시계열 DataFrame 만들기

원시 데이터에서 시간 인덱스가 있는 DataFrame을 만드는 전체 패턴은 다음과 같습니다. 날짜를 파싱하고, 인덱스를 설정하고, 정렬한 다음, 인덱스 빈도를 확인합니다. 이 설정은 이후 모든 시계열 분석의 기반이 됩니다. 리샘플링, 이동 평균, 시차 특성은 모두 깔끔하게 정렬된 DatetimeIndex에 의존합니다.

import numpy as np

# Simulate loading raw data
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=30, freq='D')
df_ts = pd.DataFrame({'sales': np.random.randint(100, 500, 30)}, index=dates)

df_ts.index.name = 'date'
print('Shape:', df_ts.shape)
print('Freq:', df_ts.index.freq)
print('Sorted:', df_ts.index.is_monotonic_increasing)
print(df_ts.head())

빠른 확인

이번 레슨에서 배운 DatetimeIndex와 기간 범위에 대한 이해도를 확인해 보세요.

레슨 요약

이번 레슨에서는 pd.date_range()로 DatetimeIndex를 만들고 pd.to_datetime()으로 날짜를 파싱하는 방법, 직관적인 날짜 선택을 위해 부분 문자열 인덱싱을 사용하는 방법, Timestamp와 Period 형식의 차이, 그리고 시간대를 다루는 방법을 배웠습니다. 다음으로 시계열의 빈도를 변경하는 리샘플링을 살펴봅니다.

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“DatetimeIndex와 기간 범위” 강의는 무료인가요?

네 — “DatetimeIndex와 기간 범위” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“DatetimeIndex와 기간 범위”에서 뭘 배우나요?

pd.date_range로 DatetimeIndex를 만들고 문자열 날짜를 파싱하며 시간 열을 인덱스로 설정해 시간 기반으로 접근합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“DatetimeIndex와 기간 범위” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. DatetimeIndex와 기간 범위
  2. 시계열 리샘플링
  3. 시프트와 지연 특성
  4. 시간 특성 추출하기
← Pandas & NumPy Academy(으)로 돌아가기