티스토리 뷰
#18 판다스 chapter 18. 시계열 데이터
시계열 데이터
datetime 오브젝트
datetime 라이브러리는 날짜와 시간을 처리하는 등의 다양한 기능을 제공하는 파이썬 라이브러리이다. datetime 라이브러리에는 날짜를 처리하는 date 오브젝트, 시간을 처리하는 time 오브젝트, 날짜와 시간을 모두 처리하는 datetime 오브젝트가 포함되어 있다.
- datetime 오브젝트 사용하기
1) datetime 오브젝트를 사용하기 위해 datetime 라이브러리를 불러온다.
from datetime import datetime
2) now, today 메서드를 사용하면 다음과 같이 현재 시간을 출력할 수 있다.
now1 = datetime.now()
print(now1)
now2 = datetime.today()
print(now2)
2021-03-26 21:06:29.357795
2021-03-26 21:06:29.357795
3) 다음은 datetime 오브젝트를 생성할 때 시간을 직접 입력하여 인자로 전달한 것이다. 각 변수를 출력하여 확인해 보면 입력한 시간을 바탕으로 datetime 오브젝트가 생성된 것을 알 수 있다.
t1 = datetime.now()
t2 = datetime(1970,1,1)
t3 = datetime(1970,12,12,13,24,34)
print(t1)
print(t2)
print(t3)
2021-03-26 21:08:40.254743
1970-01-01 00:00:00
1970-12-12 13:24:34
4) datetime 오브젝트를 사용하는 이유 중 하나는 시간 계산을 할 수 있다는 점이다. 다음은 두 datetime 오브젝트의 차이를 구한 것이다.
diff1 = t1-t2
print(diff1)
print(type(diff1))
diff2 = t2-t1
print(diff2)
print(type(diff2))
18712 days, 21:08:40.254743
<class 'datetime.timedelta'>
-18713 days, 2:51:19.745257
<class 'datetime.timedelta'>
datetime 오브젝트로 변환하기 - to_datetime 메서드
경우에 따라서는 시계열 데이터를 문자열로 저장해야 할 때도 있다. 하지만 문자열은 시간 계산을 할 수 없기 때문에 datetime 오브젝트로 변환해 주어야 한다.
- 문자열을 datetime 오브젝트로 변환하기
1) 먼저 ebola 데이터 집합을 불러온다.
import pandas as pd
import os
ebola = pd.read_csv('../data/country_timeseries.csv')
2) ebola 데이터프레임을 보면 문자열로 저장된 Date 열이 있는 것을 알 수 있다.
print(ebola.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null object
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
dtypes: float64(16), int64(1), object(1)
memory usage: 17.3+ KB
None
3) to_datetime 메서드를 사용하면 Date 열의 자료형을 datetime 오브젝트로 변환할 수 있다. 다음과 같이 to_datetime 메서드를 사용하여 Date 열의 자료형을 datetime 오브젝트로 변환한 다음 ebola 데이터프레임에 새로운 열로 추가한다.
ebola['date_dt'] = pd.to_datetime(ebola['Date'])
print(ebola.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 19 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null object
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
18 date_dt 122 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(16), int64(1), object(1)
memory usage: 18.2+ KB
None
4) 시간 형식 지정자(%d,%m,%y)와 기호를 적절히 조합하여 format 인자에 전달하면 그 형식에 맞게 정리된 datetime 오브젝트를 얻을 수 있다.
test_df1 = pd.DataFrame({'order_day':['01/01/15', '02/01/15', '03/01/15']})
test_df1['date_dt1'] = pd.to_datetime(test_df1['order_day'], format='%d/%m/%y')
test_df1['date_dt2'] = pd.to_datetime(test_df1['order_day'], format='%m/%d/%y')
test_df1['date_dt3'] = pd.to_datetime(test_df1['order_day'], format='%y/%m/%d')
print(test_df1)
order_day date_dt1 date_dt2 date_dt3
0 01/01/15 2015-01-01 2015-01-01 2001-01-15
1 02/01/15 2015-01-02 2015-02-01 2002-01-15
2 03/01/15 2015-01-03 2015-03-01 2003-01-15
test_df2 = pd.DataFrame({'order_day':['01-01-15', '02-01-15', '03-01-15']})
test_df2['date_dt'] = pd.to_datetime(test_df2['order_day'], format='%d-%m-%y')
print(test_df2)
order_day date_dt
0 01-01-15 2015-01-01
1 02-01-15 2015-01-02
2 03-01-15 2015-01-03
- 알아두면 좋아요
now 메서드로 얻은 현재시간의 시계열 데이터는 아주 정밀한 단위까지 시간을 표현한다. 하지만 원하는 시계열 데이터의 시간 요소가 연도, 월, 일 뿐이라면 now 메서드로 얻은 시계열 데이터를 잘라내야한다. 아래는 strftime 메서드와 시간 형식 지정자를 이용하여 시계열 데이터를 잘라낸 것이다.
now = datetime.now()
print(now)
nowDate = now.strftime('%Y-%m-%d')
print(nowDate)
nowTime = now.strftime('%H:%M:%S')
print(nowTime)
nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
print(nowDatetime)
2021-03-26 21:31:10.630264
2021-03-26
21:31:10
2021-03-26 21:31:10
datetime 오브젝트로 변환하기 - read_csv 메서드
앞에서 to_datetime 메서드를 사용하여 문자열로 저장되어 있는 Date 열을 datetime 오브젝트로 변환했다. 하지만 datetime 오브젝트로는 변환하려는 열을 지정하여 데이터 집합을 불러오는 것이 더 간단하다.
- datetime 오브젝트로 변환하려는 열을 지정하여 데이터 집합 불러오기
1) 다음은 read_csv 메서드의 parse_dates 인자에 datetime 오브젝트로 변환하고자 하는 열의 이름을 전달하여 집합을 불러온 것이다. 결과를 보면 Date 열이 문자열이 아니라 datetime 오브젝트라는 것을 확인할 수 있다.
ebola1 = pd.read_csv('../data/country_timeseries.csv', parse_dates=['Date'])
print(ebola1.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null datetime64[ns]
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
dtypes: datetime64[ns](1), float64(16), int64(1)
memory usage: 17.3 KB
None
datetimes 오브젝트에서 날짜 정보 추출하기
datetime 오브젝트에는 년,월,일과 같은 날짜 정보를 따로 저장하고 있는 속성이 이미 준비되어 있다.
- datetime 오브젝트에서 날짜 정보 추출하기
1) 다음은 문자열로 저장된 날짜를 시리즈에 담아 datetime 오브젝트로 변환한 것이다.
date_series = pd.Series(['2018-05-16', '2018-05-17', '2018-05-18'])
d1 = pd.to_datetime(date_series)
print(d1)
0 2018-05-16
1 2018-05-17
2 2018-05-18
dtype: datetime64[ns]
2) datetime 오브젝트(d1)의 year,month,day 속성을 이용하면 년,월,일 정보를 바로 추출할 수 있다.
print(d1[0].year)
print(d1[0].month)
print(d1[0].day)
2018
5
16
dt 접근자 사용하기
문자열을 처리하려면 str 접근자를 사용한 다음 문자열 속성이나 메서드를 사용해야 했다. datetime 오브젝트로 마찬가지로 dt 접근자를 사용하면 datetime 속성이나 메서드를 사용하여 시계열 데이터를 처리할 수 있다.
- dt 접근자로 시계열 데이터 정리하기
1) 먼저 ebola 데이터 집합을 불러온 다음 Date 열을 datetime 오브젝트로 변환하여 새로운 열로 추가한다.
ebola = pd.read_csv('C:/Users/이재윤/doit_pandas/data/country_timeseries.csv')
ebola['date_dt'] = pd.to_datetime(ebola['Date'])
2) 다음은 dt 접근자를 사용하지 않고 인덱스가 3인 데이터의 년,월,일 데이터를 추출한 것이다.
print(ebola[['Date', 'date_dt']].head())
print(ebola['date_dt'][3].year)
print(ebola['date_dt'][3].month)
print(ebola['date_dt'][3].day)
Date date_dt
0 1/5/2015 2015-01-05
1 1/4/2015 2015-01-04
2 1/3/2015 2015-01-03
3 1/2/2015 2015-01-02
4 12/31/2014 2014-12-31
2015
1
2
3) 과정 2와 같은 방법은 date_dt열의 특정 데이터를 인덱스로 접근해야 하기 때문에 불편하다. 다음은 dt 접근자로 date_dt 열에 한 번에 접근한 다음 year 속성을 이용하여 연도값을 추출할 것이다. 추출한 연도값은 ebola 데이터프레임의 새로운 열로 추가했다.
ebola['year'] = ebola['date_dt'].dt.year
print(ebola[['Date', 'date_dt', 'year']].head())
Date date_dt year
0 1/5/2015 2015-01-05 2015
1 1/4/2015 2015-01-04 2015
2 1/3/2015 2015-01-03 2015
3 1/2/2015 2015-01-02 2015
4 12/31/2014 2014-12-31 2014
4) 다음은 과정 3을 응용하여 월,일 데이터를 한 번에 추출해서 새로운 열로 추가한 것이다.
ebola['month'], ebola['day'] = (ebola['date_dt'].dt.month, ebola['date_dt'].dt.day)
print(ebola[['Date', 'date_dt', 'year', 'month', 'day']].head())
Date date_dt year month day
0 1/5/2015 2015-01-05 2015 1 5
1 1/4/2015 2015-01-04 2015 1 4
2 1/3/2015 2015-01-03 2015 1 3
3 1/2/2015 2015-01-02 2015 1 2
4 12/31/2014 2014-12-31 2014 12 31
5) 다음은 ebola 데이터프레임에 새로 추가한 date_dt, year,month,day 열의 자료형을 출력한 것이다. date_dt 열은 datetime 오브젝트이고 나머지는 정수형이라는 것을 알 수 있다.
print(ebola.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 122 entries, 0 to 121
Data columns (total 22 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 122 non-null object
1 Day 122 non-null int64
2 Cases_Guinea 93 non-null float64
3 Cases_Liberia 83 non-null float64
4 Cases_SierraLeone 87 non-null float64
5 Cases_Nigeria 38 non-null float64
6 Cases_Senegal 25 non-null float64
7 Cases_UnitedStates 18 non-null float64
8 Cases_Spain 16 non-null float64
9 Cases_Mali 12 non-null float64
10 Deaths_Guinea 92 non-null float64
11 Deaths_Liberia 81 non-null float64
12 Deaths_SierraLeone 87 non-null float64
13 Deaths_Nigeria 38 non-null float64
14 Deaths_Senegal 22 non-null float64
15 Deaths_UnitedStates 18 non-null float64
16 Deaths_Spain 16 non-null float64
17 Deaths_Mali 12 non-null float64
18 date_dt 122 non-null datetime64[ns]
19 year 122 non-null int64
20 month 122 non-null int64
21 day 122 non-null int64
dtypes: datetime64[ns](1), float64(16), int64(4), object(1)
memory usage: 21.1+ KB
None
출처 : 데이터 분석을 위한 판다스 입문
'판다스 입문' 카테고리의 다른 글
판다스 입문(시계열데이터-사례별 시계열 데이터 계산하기) (0) | 2021.03.27 |
---|---|
판다스 입문(그룹 연산 - 데이터필터링, 그룹 오브젝트) (0) | 2021.03.25 |
판다스 입문(그룹연산 - 데이터집계, 데이터 변환) (0) | 2021.03.24 |
판다스 입문(apply 메서드 활용) (0) | 2021.03.22 |
판다스 입문(문자열 처리하기) (0) | 2021.03.22 |