안녕하세요~ 꽁냥이에요.
시계열 데이터를 다루다 보면 날짜에 대한 정보가 없어서 이를 생성해줘야 할 때가 종종 있는데요. 예를 들어
미국 아이오와주 더뷰크(Dubuque) 도시의 1964년 1월부터 1975년 12월까지 온도를 나타내는 데이터가 있다고 해보죠. 이때 데이터 안에 온도는 나왔지만 날짜가 없는 경우에는 날짜를 생성해줘야 되겠지요.
이번 포스팅에서는 Pandas를 이용하여 두 날짜 사이의 날짜를 생성하는 방법에 대해서 알아보겠습니다. 여기서 다루는 내용은 다음과 같습니다.
1. 두 날짜 사이의 날짜 생성하기
날짜 생성은 Pandas에서 제공하는 date_range를 이용하면 됩니다. 사용법은 다음과 같습니다.
date_range( start='시작 날짜', end='마지막 날짜', freq='단위' , . . . )
freq 인자의 경우 두 날짜 사이의 날짜를 '일' 단위로 생성할 것인지 '월' 단위로 생성할 것인지를 정해줍니다. freq에서 자주 사용하는 인자는 다음과 같습니다.
D : 일 단위, M : 월 단위, Y : 연 단위
대소문자는 구분하지 않습니다.
이제 코드를 통해서 알아볼까요? 먼저 2019년 1월 1일부터 2020년 12월 31일사이의 날짜를 생성한다고 해볼게요. 어떻게 하면 될까요? 아래 코드를 살펴보겠습니다.
start_date = pd.to_datetime('2019-01-01') ## 시작 날짜
end_date = pd.to_datetime('2020-12-31') ## 마지막 날짜
dates = pd.date_range(start_date,end_date,freq='D') ## 일단위로 생성
line 1~2
먼저 시작 날짜를 2019년 1월 1일, 마지막 날짜를 2020년 12월 31일로 하겠습니다. 날짜는 Timestamp 형식으로 설정했습니다.
line 4
꽁냥이는 일 단위로 날짜를 생성해보았어요.
dates 변수에 담긴 값을 살펴볼게요.
보시는 바와 같이 일 단위로 날짜가 생성되었음을 알 수 있어요. 참고로 시작 날짜와 마지막 날짜의 타입을 Timestamp 형식으로 설정했지만 아래와 같이 문자열로 설정해도 작동합니다.
start_date = '2019-01-01' ## 시작 날짜
end_date = '2020-12-31' ## 마지막 날짜
이번엔 월 단위로 해볼까요? 방법은 freq 인자에 'M'을 넣어주면 됩니다.
dates = pd.date_range(start_date,end_date,freq='M') ## 월단위로 생성
아래 그림과 같이 dates 인자에는 월 단위로 날짜가 생성되었음을 알 수 있어요. 다만 각 월별로 말일이 찍혀서 나오네요.
만약 3개월 단위로 날짜를 생성하고 싶다면 어떻게 해야할까요? freq인자에 '3M'을 넣어주면 됩니다. 즉, 3개월은 3 X 1개월로 취급한다는 뜻이지요. Pandas는 정말 직관적인 방법을 제공하네요.
dates = pd.date_range(start_date,end_date,freq='3M') ## 3개월단위로 생성
아래 그림과 같이 3개월 간격으로 날짜가 생성된 것을 알 수 있어요.
freq인자에는 일 단위, 월 단위, 연 단위 이외에도 여러 가지 단위 옵션을 제공하고 있어요. 궁금하신 분들은 여기를 참고하세요.
2. 응용하기
여기서는 앞에서 배운내용을 응용해보도록 하겠습니다. 두 날짜 사이의 날짜를 생성하고 이를 데이터프레임의 인덱스로 설정해보겠습니다(사실 응용이라고 할 것까진 아니네요 ㅎㅎ).
먼저 여기에서 사용할 데이터를 불러와주세요. 이 데이터는 앞서 소개했던 미국 아이오와주 더뷰크 도시의 1964년 1월부터 1975년 12월까지 온도를 나타내는 데이터입니다.
df = pd.read_csv('http://homepage.divms.uiowa.edu/~kchan/TSA/Datasets/tempdub.dat')
하지만 아래 보시는 바와 같이 데이터 안에는 온도만 있을 뿐 날짜는 나와있지 않습니다. 1964년 1월부터 1975년 12월이라는 정보는 여기에 쓰여진 데이터 설명으로부터 알 수 있었습니다.
이제 날짜를 생성해보겠습니다. 꽁냥이는 1964년 1월부터 1975년 12월까지 월 단위로 날짜를 생성하려고 합니다. 아래 코드를 살펴볼까요?
start_date = pd.to_datetime('1964-01-01') ## 시작 날짜
end_date = pd.to_datetime('1975-12-31') ## 마지막 날짜
## 시작 날짜와 마지막 날짜 사이에 날짜를 생성하고 이를 인덱스로 설정
df.index = pd.date_range(start_date,end_date,freq='m')
line 1~2
먼저 시작 날짜를 1964년 1월 1일, 마지막 날짜를 1975년 12월 31일로 하겠습니다. 날짜는 Timestamp 형식으로 설정했습니다.
line 5
date_range를 이용하여 날짜를 생성한 후 데이터프레임의 인덱스로 설정하였습니다.
이제 데이터프레임을 보면 아래와 같이 날짜가 인덱스로 들어간 것을 확인할 수 있습니다.
이번 포스팅에서는 두 날짜 사이의 날짜를 생성하는 방법에 대해서 알아보았습니다. 실제로 꽁냥이가 시계열 데이터를 분석할 때 날짜를 생성해야 할 때가 종종 많더라고요. 오늘 다룬 내용이 시계열을 다루시는 분들에게 조금이나마 도움이 되지 않을까 합니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
[Pandas Tip] 1. Pandas Tip (1135) | 2021.05.27 |
---|---|
[Pandas] 19. concat vs append 성능 차이 알아보기 (1476) | 2021.05.20 |
[Pandas] 17. 범주형 데이터 가변수/더미 변수(dummy variable)로 바꾸기 (0) | 2021.01.19 |
[Pandas] 16. apply 함수 사용법 알아보기. (0) | 2021.01.19 |
[Pandas] 15. 결측치(Missing Value) 처리하기 (0) | 2020.12.02 |
댓글