Skip to Content

날짜/시간 데이터 처리

중급고급

학습 목표

이 레시피를 완료하면 다음을 할 수 있습니다:

  • 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

주요 포맷 코드:

코드설명예시
%Y4자리 년도2024
%m2자리 월01-12
%d2자리 일01-31
%H24시간 시00-23
%M00-59
%S00-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: float64

5. 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.23

6. 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.87

MoM (전월 대비)

# 월별 매출 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.13

YoY (전년 동월 대비)

# 전년 동월 매출 (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: 날짜 속성 추출

문제

주문 데이터에서:

  1. created_at에서 년, 월, 요일, 분기 추출
  2. 요일별 평균 주문 금액 계산
  3. 평일 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: 이동 평균 분석

문제

일별 매출 데이터에서:

  1. 7일 이동 평균과 14일 이동 평균 계산
  2. 7일 MA > 14일 MA이면 ‘상승 추세’
  3. 상승 추세인 날만 필터링
  4. 상위 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 분석 (고급)

문제

월별 매출 데이터에서:

  1. MoM (전월 대비) 증감률 계산
  2. YoY (전년 동월 대비) 증감률 계산
  3. MoM과 YoY 모두 양수인 월 찾기 (성장 월)
  4. 성장 월의 평균 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 비교

SQLPandas
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()

시간 단위 코드

코드의미예시
Dresample('D')
Wresample('W')
ME월 (월말)resample('ME')
MS월 (월초)resample('MS')
QE분기resample('QE')
YE연도resample('YE')
h시간resample('h')

다음 단계

날짜/시간 처리를 마스터했습니다! 다음으로 피벗과 재구조화에서 pivot_table(), melt(), MultiIndex 등 데이터 재구조화 기법을 배워보세요.

Last updated on

🤖AI 모의면접실전처럼 연습하기