[Pandas 강좌 – 8] Pandas(판다스)를 활용한 시계열 데이터 처리 (Date TimeIndex, Reasampling)

1. DateTimeIndex 활용

 

Pandas의 DateTimeIndex는 날짜와 시간 정보를 기반으로 하는 인덱스입니다. DateTimeIndex를 활용하면, 시간 정보에 따른 데이터 선택, 부분 데이터 집합 추출 등이 용이해집니다. 아래의 예제 코드는 일련의 날짜를 기반으로 DataFrame을 생성하고 이를 활용하는 방법을 보여줍니다. 코드에서 date_range 함수는 주어진 시작 날짜로부터 특정 기간 동안의 날짜를 생성합니다. 이 날짜들은 DataFrame의 인덱스로 사용되며, 이를 통해 각 행이 어떤 날짜에 해당하는 데이터인지를 쉽게 파악할 수 있습니다.

 

 

import pandas as pd
import numpy as np

# 날짜 범위 생성
dates = pd.date_range('20230101', periods=6)

# DataFrame 생성
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))

# 출력
print(df)

#                   A         B         C         D
# 2023-01-01  0.930245 -0.047665  0.522884  0.968767
# 2023-01-02  0.563050 -0.435333 -0.714463 -0.003575
# 2023-01-03  0.828224  0.582605  0.231393 -1.368924
# 2023-01-04  0.668463 -0.078117 -0.238567 -0.134624
# 2023-01-05  0.367208  0.428259 -1.607944  0.379299
# 2023-01-06 -1.151233  1.316921 -0.567834  0.715714

 

 

date_range() 함수는 다음과 같은 매개변수를 포함합니다.

 

  • start : 범위의 시작을 나타내는 문자열 또는 날짜 시간입니다.
  • end : 범위의 끝을 나타내는 문자열 또는 날짜 시간입니다.
  • periods : 생성할 기간 수를 나타내는 정수입니다. start와 end가 주어진 경우 이 매개변수는 선택적입니다.
  • freq : 빈도 문자열 또는 객체입니다 (예: 'D'는 일별, 'M'는 월별, 'Y'는 연간). 기본값은 'D'로 일별 빈도입니다.
  • tz : 시간대를 나타내는 문자열입니다.
  • normalize : 시작 및 종료 매개 변수를 자정으로 정규화할지 여부를 결정하는 부울. 기본값은 False입니다.
  • name : 반환된 DatetimeIndex에 대한 이름입니다.

 

 

import pandas as pd

# 2020년 1월 1일부터 10일간의 날짜 생성
print(pd.date_range(start='1/1/2020', periods=10))

# DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
#                '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
#                '2020-01-09', '2020-01-10'],
#               dtype='datetime64[ns]', freq='D')


# 2020년 1월 1일부터 2020년 2월 1일까지 일별 날짜 생성
print(pd.date_range(start='1/1/2020', end='2/1/2020'))

# DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
#                '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
#                '2020-01-09', '2020-01-10', '2020-01-11', '2020-01-12',
#                '2020-01-13', '2020-01-14', '2020-01-15', '2020-01-16',
#                '2020-01-17', '2020-01-18', '2020-01-19', '2020-01-20',
#                '2020-01-21', '2020-01-22', '2020-01-23', '2020-01-24',
#                '2020-01-25', '2020-01-26', '2020-01-27', '2020-01-28',
#                '2020-01-29', '2020-01-30', '2020-01-31', '2020-02-01'],
#               dtype='datetime64[ns]', freq='D')


# 2020년 1월 1일부터 10일간의 날짜를 시간별로 생성 (1시간 간격)
print(pd.date_range(start='1/1/2020', periods=10, freq='H'))

# DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 01:00:00',
#                '2020-01-01 02:00:00', '2020-01-01 03:00:00',
#                '2020-01-01 04:00:00', '2020-01-01 05:00:00',
#                '2020-01-01 06:00:00', '2020-01-01 07:00:00',
#                '2020-01-01 08:00:00', '2020-01-01 09:00:00'],
#               dtype='datetime64[ns]', freq='H')

 

 


2. 시계열 데이터 리샘플링

 

시계열 데이터를 처리하는 데 있어 중요한 요소 중 하나는 데이터의 리샘플링입니다. 리샘플링은 원래의 데이터를 다른 빈도로 변환하는 것을 의미하며, 이는 'downsampling'(고해상도 데이터를 저해상도로 변환)과 'upsampling'(저해상도 데이터를 고해상도로 변환)을 포함합니다. 아래의 예제 코드는 시계열 데이터의 리샘플링을 보여줍니다. 코드에서 resample 함수는 원래의 '시간별' 데이터를 '일별' 데이터로 다시 샘플링하며, 이 과정에서 각 일별 데이터는 해당 일에 해당하는 모든 시간별 데이터의 평균으로 계산됩니다.

 

 

import pandas as pd
import numpy as np

# 시간별로 표시된 데이터 생성
rng = pd.date_range('20230101', periods=100, freq='H')
print(rng)


# DatetimeIndex(['2023-01-01 00:00:00', '2023-01-01 01:00:00',
#                '2023-01-01 02:00:00', '2023-01-01 03:00:00',
#                '2023-01-01 04:00:00', '2023-01-01 05:00:00',
#                '2023-01-01 06:00:00', '2023-01-01 07:00:00',
#                '2023-01-01 08:00:00', '2023-01-01 09:00:00',
#                ...
#                '2023-01-04 22:00:00', '2023-01-04 23:00:00',
#                '2023-01-05 00:00:00', '2023-01-05 01:00:00',
#                '2023-01-05 02:00:00', '2023-01-05 03:00:00'],
#               dtype='datetime64[ns]', freq='H')



ts = pd.Series(np.random.randn(len(rng)), index=rng)
print(ts)


# 2023-01-01 00:00:00   -1.413259
# 2023-01-01 01:00:00   -0.052131
# 2023-01-01 02:00:00    1.788970
# 2023-01-01 03:00:00   -1.646791
# 2023-01-01 04:00:00   -0.249388
# ...
# 2023-01-04 23:00:00    0.039376
# 2023-01-05 00:00:00   -1.134042
# 2023-01-05 01:00:00   -0.618590
# 2023-01-05 02:00:00    1.658975
# 2023-01-05 03:00:00   -1.424104
# Freq: H, Length: 100, dtype: float64


# 데이터를 일별로 리샘플링
resampled = ts.resample('D').mean()

# 출력
print(resampled)

# 2023-01-01    0.065184
# 2023-01-02   -0.060284
# 2023-01-03   -0.170753
# 2023-01-04   -0.178925
# 2023-01-05   -0.379440
# Freq: D, dtype: float64