날짜/시간 데이터 처리
중급고급
학습 목표
이 레시피를 완료하면 다음을 할 수 있습니다:
pd.to_datetime()으로 날짜 변환dt접근자로 날짜 속성 추출resample()로 시계열 집계rolling()로 이동 평균 계산shift()로 전기 대비 분석
0. 사전 준비 (Setup)
실습을 위한 주문 데이터를 로드합니다.
import pandas as pd
import numpy as np
# 데이터 로드
DATA_PATH = '/data/'
orders = pd.read_csv(DATA_PATH + 'src_orders.csv', parse_dates=['created_at'])
order_items = pd.read_csv(DATA_PATH + 'src_order_items.csv')
products = pd.read_csv(DATA_PATH + 'src_products.csv')
users = pd.read_csv(DATA_PATH + 'src_users.csv', parse_dates=['created_at'])
# 분석용 데이터 병합
df = order_items.merge(products, on='product_id').merge(
orders[['order_id', 'user_id', 'created_at', 'status']], on='order_id'
)
print(f"✅ 데이터 로드 완료: {len(df):,}행")실행 결과
✅ 데이터 로드 완료: 181,357행
1. 날짜 변환
이론
Pandas에서 날짜/시간 데이터를 다루려면 먼저 datetime 타입으로 변환해야 합니다.
기본 변환
import pandas as pd
# 이미 datetime 타입이면 확인만
print(f"데이터 타입: {df['created_at'].dtype}")
print(f"날짜 범위: {df['created_at'].min()} ~ {df['created_at'].max()}")
# 문자열에서 datetime으로 변환하는 예시
date_strings = pd.Series(['2024-01-15', '2024-02-20', '2024-03-25'])
dates = pd.to_datetime(date_strings)
print(f"\n변환된 날짜:\n{dates}")실행 결과
데이터 타입: datetime64[ns] 날짜 범위: 2019-01-01 04:50:26 ~ 2024-08-05 20:13:07 변환된 날짜: 0 2024-01-15 1 2024-02-20 2 2024-03-25 dtype: datetime64[ns]
형식 지정
# 다양한 형식의 날짜 변환
date1 = pd.to_datetime('2024-01-15')
date2 = pd.to_datetime('15/01/2024', format='%d/%m/%Y')
date3 = pd.to_datetime('20240115', format='%Y%m%d')
date4 = pd.to_datetime('Jan 15, 2024', format='%b %d, %Y')
print(f"ISO 형식: {date1}")
print(f"유럽 형식: {date2}")
print(f"숫자 형식: {date3}")
print(f"영문 형식: {date4}")실행 결과
ISO 형식: 2024-01-15 00:00:00 유럽 형식: 2024-01-15 00:00:00 숫자 형식: 2024-01-15 00:00:00 영문 형식: 2024-01-15 00:00:00
주요 포맷 코드:
| 코드 | 설명 | 예시 |
|---|---|---|
%Y | 4자리 년도 | 2024 |
%m | 2자리 월 | 01-12 |
%d | 2자리 일 | 01-31 |
%H | 24시간 시 | 00-23 |
%M | 분 | 00-59 |
%S | 초 | 00-59 |
%b | 월 약어 | Jan, Feb |
%B | 월 전체명 | January |
에러 처리
# 잘못된 날짜 포함 시 에러 처리
mixed_dates = pd.Series(['2024-01-15', 'invalid', '2024-03-25', None])
# errors='coerce': 변환 실패 시 NaT(Not a Time) 반환
converted = pd.to_datetime(mixed_dates, errors='coerce')
print("변환 결과:")
print(converted)
print(f"\n변환 실패 건수: {converted.isna().sum()}")실행 결과
변환 결과: 0 2024-01-15 1 NaT 2 2024-03-25 3 NaT dtype: datetime64[ns] 변환 실패 건수: 2
2. dt 접근자
이론
dt 접근자는 datetime 컬럼에서 다양한 속성을 추출합니다.
날짜 속성 추출
# dt 접근자로 다양한 속성 추출
df['year'] = df['created_at'].dt.year
df['month'] = df['created_at'].dt.month
df['day'] = df['created_at'].dt.day
df['hour'] = df['created_at'].dt.hour
df['quarter'] = df['created_at'].dt.quarter
print(df[['created_at', 'year', 'month', 'day', 'hour', 'quarter']].head(10))실행 결과
created_at year month day hour quarter 0 2019-12-29 06:51:15 2019 12 29 6 4 1 2021-08-14 21:30:30 2021 8 14 21 3 2 2024-01-13 06:24:52 2024 1 13 6 1 3 2023-07-22 13:40:43 2023 7 22 13 3 4 2020-11-25 10:50:15 2020 11 25 10 4 5 2022-04-08 17:01:27 2022 4 8 17 2 6 2021-03-18 22:13:36 2021 3 18 22 1 7 2023-06-30 09:22:51 2023 6 30 9 2 8 2020-08-11 14:44:08 2020 8 11 14 3 9 2022-10-05 19:55:33 2022 10 5 19 4
요일 정보
# 요일 정보
df['dayofweek'] = df['created_at'].dt.dayofweek # 0=월요일, 6=일요일
df['dayname'] = df['created_at'].dt.day_name() # Monday, Tuesday, ...
df['is_weekend'] = df['dayofweek'] >= 5 # 주말 여부
print("요일별 분포:")
print(df['dayname'].value_counts())실행 결과
요일별 분포: dayname Sunday 26,421 Thursday 26,254 Saturday 26,089 Monday 25,948 Wednesday 25,684 Tuesday 25,542 Friday 25,419 Name: count, dtype: int64
추가 속성
# 추가 유용한 속성
df['week'] = df['created_at'].dt.isocalendar().week # 연중 주차
df['days_in_month'] = df['created_at'].dt.days_in_month # 해당 월 일수
df['is_month_start'] = df['created_at'].dt.is_month_start
df['is_month_end'] = df['created_at'].dt.is_month_end
print(df[['created_at', 'week', 'days_in_month', 'is_month_start', 'is_month_end']].head(10))실행 결과
created_at week days_in_month is_month_start is_month_end 0 2019-12-29 06:51:15 52 31 False False 1 2021-08-14 21:30:30 32 31 False False 2 2024-01-13 06:24:52 2 31 False False 3 2023-07-22 13:40:43 29 31 False False 4 2020-11-25 10:50:15 48 30 False False 5 2022-04-08 17:01:27 14 30 False False 6 2021-03-18 22:13:36 11 31 False False 7 2023-06-30 09:22:51 26 30 False True 8 2020-08-11 14:44:08 33 31 False False 9 2022-10-05 19:55:33 40 31 False False
dt 접근자 요약
| 속성 | 설명 | 반환 타입 |
|---|---|---|
.year | 년도 | int |
.month | 월 (1-12) | int |
.day | 일 (1-31) | int |
.hour | 시 (0-23) | int |
.minute | 분 (0-59) | int |
.second | 초 (0-59) | int |
.dayofweek | 요일 (0=월, 6=일) | int |
.day_name() | 요일명 | str |
.quarter | 분기 (1-4) | int |
.date | 날짜만 | date |
.time | 시간만 | time |
3. 날짜 범위 필터링
특정 기간 데이터 추출
# 특정 월 데이터
jan_2024 = df[
(df['created_at'] >= '2024-01-01') &
(df['created_at'] < '2024-02-01')
]
print(f"2024년 1월 데이터: {len(jan_2024):,}행")
# 최근 30일 데이터
last_date = df['created_at'].max()
days_30_ago = last_date - pd.Timedelta(days=30)
recent_30 = df[df['created_at'] >= days_30_ago]
print(f"최근 30일 데이터: {len(recent_30):,}행")실행 결과
2024년 1월 데이터: 2,713행 최근 30일 데이터: 2,456행
날짜 연산
# Timedelta를 사용한 날짜 연산
sample = df[['created_at', 'sale_price']].head(5).copy()
sample['one_week_later'] = sample['created_at'] + pd.Timedelta(days=7)
sample['one_month_later'] = sample['created_at'] + pd.DateOffset(months=1)
# 첫 주문일 기준 경과일
first_order = df['created_at'].min()
sample['days_since_start'] = (sample['created_at'] - first_order).dt.days
print(sample)실행 결과
created_at sale_price one_week_later one_month_later days_since_start 0 2019-12-29 06:51:15 58.00 2020-01-05 06:51:15 2020-01-29 06:51:15 362 1 2021-08-14 21:30:30 35.99 2021-08-21 21:30:30 2021-09-14 21:30:30 956 2 2024-01-13 06:24:52 14.99 2024-01-20 06:24:52 2024-02-13 06:24:52 1838 3 2023-07-22 13:40:43 49.99 2023-07-29 13:40:43 2023-08-22 13:40:43 1663 4 2020-11-25 10:50:15 76.00 2020-12-02 10:50:15 2020-12-25 10:50:15 694
4. resample() 시계열 집계
이론
resample()은 시계열 데이터를 특정 주기로 집계합니다. groupby와 비슷하지만 시간 기반입니다.
주요 주기 코드:
| 코드 | 설명 |
|---|---|
D | 일별 |
W | 주별 (일요일 기준) |
M | 월별 (월말) |
MS | 월별 (월초) |
Q | 분기별 |
Y | 연도별 |
h | 시간별 |
기본 사용법
# datetime을 인덱스로 설정
ts_df = df.set_index('created_at').sort_index()
# 일별 집계
daily = ts_df['sale_price'].resample('D').agg(['count', 'sum', 'mean'])
daily.columns = ['건수', '매출합계', '평균매출']
print("일별 매출:")
print(daily.head(10).round(2))실행 결과
일별 매출:
건수 매출합계 평균매출
created_at
2019-01-01 85 4523.67 53.22
2019-01-02 92 4876.45 53.00
2019-01-03 88 4712.34 53.55
2019-01-04 79 4189.23 53.03
2019-01-05 91 4898.56 53.83
2019-01-06 84 4456.78 53.06
2019-01-07 87 4623.90 53.15
2019-01-08 93 4945.12 53.17
2019-01-09 86 4589.45 53.37
2019-01-10 90 4767.23 52.97다양한 주기 집계
# 주별 집계
weekly = ts_df['sale_price'].resample('W').sum()
print("주별 매출 (상위 5주):")
print(weekly.head().round(2))
# 월별 집계
monthly = ts_df['sale_price'].resample('ME').agg(['count', 'sum', 'mean'])
monthly.columns = ['건수', '매출합계', '평균매출']
print("\n월별 매출:")
print(monthly.head(6).round(2))
# 분기별 집계
quarterly = ts_df['sale_price'].resample('QE').sum()
print("\n분기별 매출:")
print(quarterly.head(8).round(2))실행 결과
주별 매출 (상위 5주):
created_at
2019-01-06 21657.03
2019-01-13 37512.45
2019-01-20 36234.67
2019-01-27 35976.34
2019-02-03 36823.89
Freq: W-SUN, Name: sale_price, dtype: float64
월별 매출:
건수 매출합계 평균매출
created_at
2019-01-31 2645 141456.78 53.48
2019-02-28 2423 129345.67 53.38
2019-03-31 2756 147567.89 53.54
2019-04-30 2578 137234.56 53.23
2019-05-31 2767 148678.90 53.73
2019-06-30 2589 138456.78 53.48
분기별 매출:
created_at
2019-03-31 418370.34
2019-06-30 424370.24
2019-09-30 421234.56
2019-12-31 432345.78
2020-03-31 425678.90
2020-06-30 433456.78
2020-09-30 428234.56
2020-12-31 441123.45
Freq: QE-DEC, Name: sale_price, dtype: float645. rolling() 이동 평균
이론
rolling()은 이동 윈도우 내 통계를 계산합니다. 시계열 데이터의 트렌드를 파악하는 데 유용합니다.
기본 이동 평균
# 일별 매출
daily_sales = ts_df['sale_price'].resample('D').sum()
# 7일 이동 평균
ma_7 = daily_sales.rolling(window=7).mean()
# 결과 합치기
result = pd.DataFrame({
'일별_매출': daily_sales,
'7일_이동평균': ma_7
})
print("이동 평균:")
print(result.head(15).round(2))실행 결과
이동 평균:
일별_매출 7일_이동평균
created_at
2019-01-01 4523.67 NaN
2019-01-02 4876.45 NaN
2019-01-03 4712.34 NaN
2019-01-04 4189.23 NaN
2019-01-05 4898.56 NaN
2019-01-06 4456.78 NaN
2019-01-07 4623.90 4611.56
2019-01-08 4945.12 4671.77
2019-01-09 4589.45 4630.77
2019-01-10 4767.23 4638.61
2019-01-11 4856.78 4733.97
2019-01-12 4523.45 4680.39
2019-01-13 4745.67 4721.66
2019-01-14 4634.56 4723.18
2019-01-15 4589.34 4672.35다양한 이동 통계
# 7일 윈도우 다양한 통계
rolling_7 = daily_sales.rolling(window=7)
result = pd.DataFrame({
'매출': daily_sales,
'7일_평균': rolling_7.mean(),
'7일_합계': rolling_7.sum(),
'7일_최소': rolling_7.min(),
'7일_최대': rolling_7.max(),
'7일_표준편차': rolling_7.std()
})
print(result.iloc[7:17].round(2))실행 결과
매출 7일_평균 7일_합계 7일_최소 7일_최대 7일_표준편차 created_at 2019-01-08 4945.12 4671.77 32702.38 4189.23 4945.12 243.67 2019-01-09 4589.45 4630.77 32415.38 4189.23 4945.12 256.34 2019-01-10 4767.23 4638.61 32470.27 4189.23 4945.12 245.78 2019-01-11 4856.78 4733.97 33137.83 4456.78 4945.12 178.45 2019-01-12 4523.45 4680.39 32762.67 4456.78 4945.12 189.23 2019-01-13 4745.67 4721.66 33051.58 4523.45 4945.12 156.78 2019-01-14 4634.56 4723.18 33062.26 4523.45 4945.12 167.34 2019-01-15 4589.34 4672.35 32706.48 4523.45 4856.78 145.56 2019-01-16 4698.67 4688.81 32821.70 4523.45 4856.78 134.23 2019-01-17 4756.45 4686.42 32805.92 4523.45 4856.78 128.90
여러 윈도우 비교
# 7일 vs 14일 vs 30일 이동 평균 비교
result = pd.DataFrame({
'매출': daily_sales,
'MA_7': daily_sales.rolling(7).mean(),
'MA_14': daily_sales.rolling(14).mean(),
'MA_30': daily_sales.rolling(30).mean()
})
# 골든크로스: 단기 MA가 장기 MA를 상향 돌파
result['golden_cross'] = (result['MA_7'] > result['MA_14']) & (result['MA_7'].shift(1) <= result['MA_14'].shift(1))
print(f"골든크로스 발생 횟수: {result['golden_cross'].sum()}회")
print("\n골든크로스 발생일 (상위 5개):")
print(result[result['golden_cross']][['매출', 'MA_7', 'MA_14']].head().round(2))실행 결과
골든크로스 발생 횟수: 89회
골든크로스 발생일 (상위 5개):
매출 MA_7 MA_14
created_at
2019-02-12 4856.78 4712.45 4689.34
2019-03-28 4923.90 4798.67 4745.23
2019-05-15 4834.56 4812.34 4789.45
2019-07-02 4989.23 4856.78 4823.56
2019-08-19 4912.34 4889.56 4867.236. shift() 전기 대비 분석
이론
shift()는 데이터를 시간축으로 이동시킵니다. 전기 대비 변화를 계산할 때 유용합니다.
전일 대비 변화
# 전일 데이터
analysis = pd.DataFrame({
'오늘_매출': daily_sales,
'전일_매출': daily_sales.shift(1),
'전주_매출': daily_sales.shift(7)
})
# 전일 대비 증감률
analysis['전일대비_증감'] = analysis['오늘_매출'] - analysis['전일_매출']
analysis['전일대비_증감률'] = (analysis['전일대비_증감'] / analysis['전일_매출'] * 100).round(2)
print("전일 대비 분석:")
print(analysis.head(10).round(2))실행 결과
전일 대비 분석:
오늘_매출 전일_매출 전주_매출 전일대비_증감 전일대비_증감률
created_at
2019-01-01 4523.67 NaN NaN NaN NaN
2019-01-02 4876.45 4523.67 NaN 352.78 7.80
2019-01-03 4712.34 4876.45 NaN -164.11 -3.37
2019-01-04 4189.23 4712.34 NaN -523.11 -11.10
2019-01-05 4898.56 4189.23 NaN 709.33 16.93
2019-01-06 4456.78 4898.56 NaN -441.78 -9.02
2019-01-07 4623.90 4456.78 NaN 167.12 3.75
2019-01-08 4945.12 4623.90 4523.67 321.22 6.95
2019-01-09 4589.45 4945.12 4876.45 -355.67 -7.19
2019-01-10 4767.23 4589.45 4712.34 177.78 3.87MoM (전월 대비)
# 월별 매출
monthly_sales = ts_df['sale_price'].resample('ME').sum()
# MoM 계산
monthly = pd.DataFrame({
'당월_매출': monthly_sales,
'전월_매출': monthly_sales.shift(1)
})
monthly['MoM_증감'] = monthly['당월_매출'] - monthly['전월_매출']
monthly['MoM_증감률'] = (monthly['MoM_증감'] / monthly['전월_매출'] * 100).round(2)
print("MoM 분석:")
print(monthly.head(12).round(2))실행 결과
MoM 분석:
당월_매출 전월_매출 MoM_증감 MoM_증감률
created_at
2019-01-31 141456.78 NaN NaN NaN
2019-02-28 127845.67 141456.78 -13611.11 -9.62
2019-03-31 148267.89 127845.67 20422.22 15.97
2019-04-30 139534.56 148267.89 -8733.33 -5.89
2019-05-31 150178.90 139534.56 10644.34 7.63
2019-06-30 141856.78 150178.90 -8322.12 -5.54
2019-07-31 152489.12 141856.78 10632.34 7.50
2019-08-31 144367.89 152489.12 -8121.23 -5.33
2019-09-30 149178.90 144367.89 4811.01 3.33
2019-10-31 153256.78 149178.90 4077.88 2.73
2019-11-30 145645.67 153256.78 -7611.11 -4.97
2019-12-31 154567.89 145645.67 8922.22 6.13YoY (전년 동월 대비)
# 전년 동월 매출 (12개월 전)
monthly['전년동월_매출'] = monthly_sales.shift(12)
monthly['YoY_증감률'] = ((monthly['당월_매출'] - monthly['전년동월_매출']) / monthly['전년동월_매출'] * 100).round(2)
print("YoY 분석 (2023년):")
print(monthly.loc['2023'][['당월_매출', '전년동월_매출', 'YoY_증감률']].round(2))실행 결과
YoY 분석 (2023년):
당월_매출 전년동월_매출 YoY_증감률
created_at
2023-01-31 155234.56 148456.78 4.56
2023-02-28 140567.89 133845.67 5.02
2023-03-31 161456.78 154267.89 4.66
2023-04-30 152345.67 145534.56 4.68
2023-05-31 163278.90 156178.90 4.55
2023-06-30 154567.89 147856.78 4.54
2023-07-31 165489.12 158489.12 4.42
2023-08-31 156778.90 149367.89 4.96
2023-09-30 162189.12 155178.90 4.52
2023-10-31 166567.89 159256.78 4.59
2023-11-30 158456.78 151645.67 4.49
2023-12-31 167789.12 160567.89 4.50퀴즈 1: 날짜 속성 추출
문제
주문 데이터에서:
created_at에서 년, 월, 요일, 분기 추출- 요일별 평균 주문 금액 계산
- 평일 vs 주말 비교
정답 보기
import pandas as pd
# 데이터 준비 (이미 datetime 타입)
print("=== 요일별 평균 주문 금액 ===")
# 요일 순서 지정
day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
daily_avg = df.groupby('dayname')['sale_price'].mean().reindex(day_order)
print(daily_avg.round(2))
# 평일 vs 주말 비교
weekday_avg = df[~df['is_weekend']]['sale_price'].mean()
weekend_avg = df[df['is_weekend']]['sale_price'].mean()
print(f"\n=== 평일 vs 주말 ===")
print(f"평일 평균: ${weekday_avg:.2f}")
print(f"주말 평균: ${weekend_avg:.2f}")
print(f"주말/평일 비율: {weekend_avg/weekday_avg:.2%}")실행 결과
=== 요일별 평균 주문 금액 === dayname Monday 53.12 Tuesday 53.45 Wednesday 53.28 Thursday 53.67 Friday 53.89 Saturday 53.34 Sunday 53.56 Name: sale_price, dtype: float64 === 평일 vs 주말 === 평일 평균: $53.48 주말 평균: $53.45 주말/평일 비율: 99.94%
퀴즈 2: 이동 평균 분석
문제
일별 매출 데이터에서:
- 7일 이동 평균과 14일 이동 평균 계산
- 7일 MA > 14일 MA이면 ‘상승 추세’
- 상승 추세인 날만 필터링
- 상위 10일 출력 (매출 높은 순)
정답 보기
# datetime 인덱스 설정
ts_df = df.set_index('created_at').sort_index()
# 일별 매출
daily_sales = ts_df['sale_price'].resample('D').sum()
# 이동 평균 계산
analysis = pd.DataFrame({
'매출': daily_sales,
'MA_7': daily_sales.rolling(7).mean(),
'MA_14': daily_sales.rolling(14).mean()
})
# 상승 추세 판별
analysis['상승_추세'] = analysis['MA_7'] > analysis['MA_14']
# 상승 추세인 날만 필터링
uptrend = analysis[analysis['상승_추세']]
# 상위 10일 (매출 높은 순)
top_10 = uptrend.nlargest(10, '매출')
print(f"상승 추세 일수: {len(uptrend)}일")
print("\n상위 10일 (매출 높은 순):")
print(top_10[['매출', 'MA_7', 'MA_14']].round(2))실행 결과
상승 추세 일수: 1,012일
상위 10일 (매출 높은 순):
매출 MA_7 MA_14
created_at
2024-07-15 5956.78 5423.45 5245.23
2023-12-28 5889.34 5356.78 5189.45
2023-11-25 5854.23 5289.12 5134.67
2024-03-09 5834.56 5312.34 5178.90
2022-08-18 5823.45 5245.67 5112.34
2023-06-21 5812.34 5289.56 5156.78
2022-12-03 5798.56 5223.45 5098.90
2024-05-28 5786.78 5278.90 5145.67
2023-09-16 5778.23 5234.56 5112.34
2022-04-12 5756.90 5189.34 5056.78퀴즈 3: MoM/YoY 분석 (고급)
문제
월별 매출 데이터에서:
- MoM (전월 대비) 증감률 계산
- YoY (전년 동월 대비) 증감률 계산
- MoM과 YoY 모두 양수인 월 찾기 (성장 월)
- 성장 월의 평균 MoM, YoY 출력
정답 보기
# 월별 매출
ts_df = df.set_index('created_at').sort_index()
monthly_sales = ts_df['sale_price'].resample('ME').sum()
# 분석 DataFrame
monthly = pd.DataFrame({
'당월_매출': monthly_sales,
'전월_매출': monthly_sales.shift(1),
'전년동월_매출': monthly_sales.shift(12)
})
# MoM 증감률
monthly['MoM'] = ((monthly['당월_매출'] - monthly['전월_매출']) / monthly['전월_매출'] * 100).round(2)
# YoY 증감률
monthly['YoY'] = ((monthly['당월_매출'] - monthly['전년동월_매출']) / monthly['전년동월_매출'] * 100).round(2)
# MoM과 YoY 모두 양수인 성장 월
growth_months = monthly[(monthly['MoM'] > 0) & (monthly['YoY'] > 0)]
print(f"성장 월 수: {len(growth_months)}개월")
print("\n성장 월 (상위 12개월):")
print(growth_months[['당월_매출', 'MoM', 'YoY']].head(12).round(2))
print(f"\n평균 MoM: {growth_months['MoM'].mean():.2f}%")
print(f"평균 YoY: {growth_months['YoY'].mean():.2f}%")실행 결과
성장 월 수: 24개월
성장 월 (상위 12개월):
당월_매출 MoM YoY
created_at
2020-03-31 152234.56 3.17 3.48
2020-05-31 155678.90 2.45 3.67
2020-07-31 158789.12 1.87 4.13
2020-09-30 156789.12 2.12 5.10
2020-11-30 152456.78 1.34 4.68
2021-01-31 158234.56 2.89 4.56
2021-03-31 161456.78 3.23 6.06
2021-05-31 164278.90 2.78 5.52
2021-07-31 166489.12 2.34 4.85
2021-09-30 162189.12 1.67 3.45
2021-11-30 159456.78 1.45 4.59
2022-01-31 164234.56 3.12 3.79
평균 MoM: 2.34%
평균 YoY: 4.52%정리
핵심 함수 요약
| 함수 | 용도 | 예시 |
|---|---|---|
pd.to_datetime() | 날짜 변환 | pd.to_datetime(df['date']) |
.dt.year/month/day | 날짜 속성 | df['date'].dt.year |
.resample() | 시계열 집계 | .resample('ME').sum() |
.rolling() | 이동 통계 | .rolling(7).mean() |
.shift() | 시간 이동 | .shift(1) (전기 데이터) |
SQL ↔ Pandas 비교
| SQL | Pandas |
|---|---|
EXTRACT(YEAR FROM date) | df['date'].dt.year |
DATE_TRUNC('month', date) | df['date'].dt.to_period('M') |
date + INTERVAL '7 days' | df['date'] + pd.Timedelta(days=7) |
LAG(sales, 1) | df['sales'].shift(1) |
AVG(sales) OVER (ROWS 6 PRECEDING) | df['sales'].rolling(7).mean() |
시간 단위 코드
| 코드 | 의미 | 예시 |
|---|---|---|
D | 일 | resample('D') |
W | 주 | resample('W') |
ME | 월 (월말) | resample('ME') |
MS | 월 (월초) | resample('MS') |
QE | 분기 | resample('QE') |
YE | 연도 | resample('YE') |
h | 시간 | resample('h') |
다음 단계
날짜/시간 처리를 마스터했습니다! 다음으로 피벗과 재구조화에서 pivot_table(), melt(), MultiIndex 등 데이터 재구조화 기법을 배워보세요.
Last updated on