조금씩 꾸준히 완성을 향해

[Pandas] 시계열 데이터 생성, 변환, 분리, 인덱싱(to_datetime, to_period, date_range, period_range 등) 본문

Python/Numpy & Pandas

[Pandas] 시계열 데이터 생성, 변환, 분리, 인덱싱(to_datetime, to_period, date_range, period_range 등)

all_sound 2022. 10. 5. 14:53

시계열 데이터


  • 판다스는 주식, 환율 등 금융 데이터를 다루기 위해 개발된 라이브러리
  • 시계열(time series) 데이터를 다루는 여러가지 유용한 기능 제공
  • 시계열 데이터를 데이터프레임의 행 인덱스로 사용하면 시간으로 기록된 데이터 분석에 매우 편리
  • 판다스 시간 표시 방식 중 시계열 데이터 표현에 자주 이용되는 두가지 유형
    • 특정한 시점을 기록하는 Timestamp
    • 두 시점 사이의 일정한 기간을 나타내는 Period

 

다른 자료형을 Timestamp 객체로 변환


▶ 문자열을 Timestamp로 변환

  • 판다스 to_datetime() 함수 : 다른 자료형을 판다스 Timestamp를 나타내는 datetime64 자료형으로 변환
# stock-data.csv 파일 불러오기
df = pd.read_csv('/content/drive/MyDrive/ Encore Prac/stock-data.csv')
df.head(5)

# Date 열 데이터 타입 확인
df.dtypes

# Date열을 Timestamp 객체로 변경해서 new_Date 열에 저장
df['new_Date'] = pd.to_datetime(df.Date)
# new_Date 값 확인
df.new_Date[0]
# Timestamp('2018-07-02 00:00:00')
#데이터 타입 확인
type(df.new_Date[0])
# pandas._libs.tslibs.timestamps.Timestamp
# index를 new_Date로 변경
df.set_index('new_Date', inplace=True)

# Date 열 삭제
df.drop('Date', axis=1)
# 바뀐 인덱스 확인
df.index

 

Timestamp를 Period로 변환


  • 판다스 to_period() 함수 : Timestamp 객체를 일정 기간을 나타내는 Period 객체로 변환
  • freq 옵션에 기준이 되는 기간 설정

 

▶ freq 옵션 

 

옵션 설명 옵션 설명
D day(1일) B business day(휴일 제외)
W week(1주) H hour(1시간)
M month end(월 말) T minute(1분)
MS month begin(월 초) S second(1초)
Q quarter end(분기 말) L millisecond(1/1,000초)
QS quarter begin(분기 초) U microseond(1/1,000,000초)
A year end(연말) N nanoseconed(1/1,000,000,000초)
AS year begin(연초) ... ...

 

 

▶Timestamp를 Period로 변환

# 문자열 데이터(시리즈객체)를 판다스 Timestamp로 변환
dates = ['2019-01-01', '2020-03-01', '2021-06-01']
ts_dates = pd.to_datetime(dates)
ts_dates
# DatetimeIndex(['2019-01-01', '2020-03-01', '2021-06-01'], dtype='datetime64[ns]', freq=None)
#Timestamp를 Period로 변환
pr_day = ts_dates.to_period(freq='D')  # day 옵션(년+월+일)
print(pr_day)
pr_month = ts_dates.to_period(freq='M')  # month 옵션(년+월)
print(pr_month)
pr_year = ts_dates.to_period(freq='A')  # year 옵션(년)
print(pr_year)

# PeriodIndex(['2019-01-01', '2020-03-01', '2021-06-01'], dtype='period[D]')
# PeriodIndex(['2019-01', '2020-03', '2021-06'], dtype='period[M]')
# PeriodIndex(['2019', '2020', '2021'], dtype='period[A-DEC]')

 

 

시계열 데이터 만들기


  • data_range() : 여러 개의 날짜가 들어 있는 Timestamp 시계열 데이터 생성
  • period_range() : 여러 개의 기간이 들어 있는 Period 시계열 데이터 생성
    • 옵션 => (start: 날짜 범위의 시작, end: 날짜 범위의 끝, periods: 생성할 타임스템프의 개수, freq : 시간 간격, tz: timezone(Asia/Seoul)

 

▶ date_range

# 2022-01-01 부터 월의 첫날짜를 한달 간격으로 6개 생성
pd.date_range(start='2022-01-01', periods=6, freq='MS', tz='Asia/Seoul')

'''DatetimeIndex(['2022-01-01 00:00:00+09:00', '2022-02-01 00:00:00+09:00',
              '2022-03-01 00:00:00+09:00', '2022-04-01 00:00:00+09:00',
              '2022-05-01 00:00:00+09:00', '2022-06-01 00:00:00+09:00'],
              dtype='datetime64[ns, Asia/Seoul]', freq='MS')'''
# 한달 간격으로 각 달의 마지막 날짜를 6개 생성
pd.date_range(start='2022-01-01', periods=6, freq='M') 

'''DatetimeIndex(['2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30',
               '2022-05-31', '2022-06-30'],
              dtype='datetime64[ns]', freq='M')'''
# 분기(3개월) 간격, 월의 마지막 날짜를 6개 생성
pd.date_range(start='2022-01-01', periods=6, freq='3M')  
#freq='3M': 해당 날짜를 기준으로 분기 길이를 자유롭게 조정가능
'''DatetimeIndex(['2022-01-31', '2022-04-30', '2022-07-31', '2022-10-31',
               '2023-01-31', '2023-04-30'],
              dtype='datetime64[ns]', freq='3M')'''


pd.date_range(start='2022-01-01', periods=6, freq='Q') 
# freq='Q': 정해져 있는 분기말 날짜 
'''DatetimeIndex(['2022-03-31', '2022-06-30', '2022-09-30', '2022-12-31',
               '2023-03-31', '2023-06-30'],
              dtype='datetime64[ns]', freq='Q-DEC')'''

 

▶ period_range()

#period 배열 만들기 
# 2022-01-01부터 한달 길이 객체 3개 생성
pd.period_range(start='2022-01-01', periods=3, freq='M') 

# PeriodIndex(['2022-01', '2022-02', '2022-03'], dtype='period[M]')
# 2022-01-01부터 2시간 길이 객체 3개 생성
pd.period_range(start='2022-01-01', periods=3, freq='2H')

# PeriodIndex(['2022-01-01 00:00', '2022-01-01 02:00', '2022-01-01 04:00'], dtype='period[2H]')

 

 

날짜 데이터 분리


# 데이터 확인
df.head(3)

# Timestamp객체의 연, 월, 일 각각 추축해서 새로운 열 생성
df['year'] = df['new_Date'].dt.year
df['month'] = df['new_Date'].dt.month
df['day'] = df['new_Date'].dt.day
# 데이터 확인
df.head(3)

# Timestamp를 Period로 변환하여 년원일 표기 변경하기, freq 옵션 사용
df['Date_yr'] = df['new_Date'].dt.to_period(freq='A')
df['Date_m'] = df['new_Date'].dt.to_period(freq='M')
# 추출한 날짜 정보 Date_m 열을 데이터 프레임의 행 인덱스로 지정
df.set_index('Date_m', inplace=True)
df.head(3)

 

 

날짜 인덱스 활용


# 2018년 데이터 인덱싱
df.loc['2018'].head(3)

# 2018년 6월 데이터 인덱싱
df.loc['2018-06'].head(3)
df['2018-06'].head(3)  #열 지정 방식으로도 인덱싱 가능

# 2018년 6월의 Start, High 열 데이터 인덱싱
df.loc['2018-06', ['Start', 'High']].head(3)

# 데이터 정렬 후 구간 인덱싱
df.sort_index().loc['2018-06-20': '2018-06-25']