데이터분석과 개발

[Pandas] 년,월,일 따로 있는 데이터 읽기 : parse_dates, date_parser, index_col 본문

AI(시계열)/데이터 전처리

[Pandas] 년,월,일 따로 있는 데이터 읽기 : parse_dates, date_parser, index_col

긍정적인마인드 2023. 1. 8. 22:34

* 공부한 것을 정리한 글이므로 틀린 내용이 있을 수 있습니다.

* 더 좋은 방법 또는 틀린부분이 발견될 시 계속 수정하며 업데이트 할 예정입니다.

 

 

데이터를 읽어올 때 인덱스에 한번에 시간을 datetime형식으로 넣어주고 싶을때가 많습니다.

특히 시계열이라면 더욱 그렇겠죠.

그래서 시간 성분이 나눠진 데이터셋 (ex. 년 / 월 / 일..) 을 바로 datetime형식으로 인덱스에 넣어주는 전처리를

정리해보려 합니다.

 

사용할 데이터는 UCI 사이트의 베이징 대기오염 데이터셋입니다.

 

https://archive.ics.uci.edu/ml/datasets/Beijing+PM2.5+Data 

 

UCI Machine Learning Repository: Beijing PM2.5 Data Data Set

Beijing PM2.5 Data Data Set Download: Data Folder, Data Set Description Abstract: This hourly data set contains the PM2.5 data of US Embassy in Beijing. Meanwhile, meteorological data from Beijing Capital International Airport are also included. Data Set C

archive.ics.uci.edu

 

# 데이터셋
df = pd.read_csv('./data/PRSA_data_2010.1.1-2014.12.31.csv')
df

 

데이터를 보면 하나의 날짜컬럼으로 되어있지 않고 year, month, day, hour가 다 따로 되어있는 것을 볼 수 있습니다.

이 데이터를 read_csv 함수의 파라미터들을 통해 더 편하게 Datetime인덱스로 만들어보려 합니다.

 

1. parse_dates

 

판다스 read_csv함수안에 parse_dates 는 날짜형식으로 되어있는 데이터를 datetime형식으로 바꿔주는 함수입니다.

공식문서를 참조하면 4가지 형태로 사용할 수 있다고 나와있네요.

사용할 parse_dates 는 (3) parse_dates = 리스트의 리스트 이니 (3)에 집중해 주세요!

 

(1) parse_dates = True

 

parse_dates에 불린(boolean)형식을 넣어주게 되면 인덱스를 datetime형식으로 바꿔줄 수 있다고 합니다.

지금 데이터셋의 경우 그냥 숫자이기 때문에 아무 변화가 없는 모습입니다.

# parse_dates 사용: 인덱스
df = pd.read_csv('./data/PRSA_data_2010.1.1-2014.12.31.csv', parse_dates=True)
df

 

 

(2) parse_dates = 리스트형식

 

parse_dates에 리스트 형식을 넣어주게 되면 (ex. [1,2,3,4] or ['year','month','day','hour'] )

리스트에 해당하는 컬럼을 모두 datetime형식으로 바꿔준다고 합니다.

지금 데이터셋 같은 경우 year의 경우만 datetime형식을 만족했기 때문에 바꿔진 모습입니다.

( 만족했다기보다는 년도만 넣어줘도 자동으로 xxxx년 1월 1일로 바꿀수 있기 때문!)

 

# parse_dates 사용: 리스트
df = pd.read_csv('./data/PRSA_data_2010.1.1-2014.12.31.csv', parse_dates=['year','month','day','hour'])
df

 

(3) parse_dates = 리스트의 리스트 형식

 

마지막으로 데이터셋에 사용할 형식입니다. (공식 문서에 list of list 라고 표현하고 있네요)

parse_dates에 리스트의 리스트 형식을 넣어주게 되면 (ex. [[1,2,3,4]] or [['year','month','day','hour']] )

넣어준 컬럼들을 하나로 합쳐 datetime형식으로 만들게 됩니다.

단순 공백으로 합치기 때문에 datetime형식으로 바뀌지 않았네요

 

 

여기서 parse_dates 를 도와줄 수 있는 date_parser 가 있습니다.

date_parser에 데이터를 datetime형식으로 바꿔주는 함수를 넣어준다면 parse_dates를 통해 datetime 형식으로 바꿀 수 있습니다.

 

# date_parser 에 넣어줄 함수 정의
def parser(x):
    parser = datetime.strptime(x,'%Y %m %d %H')
    return parser

 

이 parser 함수를 date_parser 함수에 넣어주게 되면

 

# parse_dates 사용
df = pd.read_csv('./data/PRSA_data_2010.1.1-2014.12.31.csv',
	parse_dates=[['year','month','day','hour']],
	date_parser=parser)
df

 

object였던 데이터 형식이 datetime 형식으로 잘 바뀐 것을 볼 수 있습니다.

 

마지막으로 index_col 을 사용하여 바뀐 datetime형식의 데이터를 인덱스에 넣어주면 분석하기 쉬운 DatetimeIndex형식의 데이터로 바로 읽어올 수 있게 됩니다.

index_col 은 인덱스에 넣어줄 컬럼을 지정해주는 파라미터 입니다. 인덱스 또는 직접 컬럼이름을 적어서 지정해 줄 수 있습니다.

# parse_dates , index_col 사용
df = pd.read_csv('./data/PRSA_data_2010.1.1-2014.12.31.csv',
                 parse_dates=[['year','month','day','hour']],
                 date_parser=parser,
                 index_col=0)
df

 

DatetimeIndex로 잘 읽어진 것을 볼 수 있습니다.

사실 자주 사용할 것 같진 않지만 알아둔다면 좀 더 편하게 전처리 할 수 있을 것 같네요.

오늘 정리는 여기서 마치도록 하겠습니다. 감사합니다!

 

 

참고:

https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/

 

* pandas공식문서

https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html