-
Chapter 12-1 datetime 오브젝트Do it! 판다스 입문 2022. 6. 26. 17:01
datetime 라이브러리는 날짜와 시간을 처리하는 등의 다양한 기능을 제공하는 파이썬 라이브러리입니다. datetime 라이브러리에는 날짜를 처리하는 date 오브젝트, 시간을 처리하는 time 오브젝트, 날짜와 시간을 모두 처리하는 datetime 오브젝트가 포함되어 있습니다. 앞으로 3개의 오브젝트를 명확히 구분하기 위해 영문을 그대로 살려 date, time, datetime 오브젝트라고 부르겠습니다.
datetime 오브젝트 사용하기
1. datetime 오브젝트를 사용하기 위해 datetime 라이브러리를 불러옵니다.
from datetime import datetime 2. now, today 메서드를 사용하면 다음과 같이 현재 시간을 출력할 수 있습니다.
now1 = datetime.now( )
print(now1)
2018-05-18 13:18:39.322084
now2 = datetime.today( )
print(now2)
2018-05-18 13:18:40.9575983. 다음은 datetime 오브젝트를 생성할 때 시간을 직접 입력하여 인자로 전달한 것입니다. 각 변수를 출력하여 확인해 보면 입력한 시간을 바탕으로 datetime 오브젝트가 생성된 것을 알 수 있습니다.
t1 = datetime.now( )
t2 = datetime(1970, 1, 1)
t3 = datetime(1970, 12, 12, 13, 24, 34)
print(t1)
print(t2)
print(t3)
2018-05-15 13:23:06.389968
1970-01-01 00:00:00
1970-12-12 13:24:344. datetime 오브젝트를 사용하는 이유 중 하나는 시간 계산을 할 수 있다는 점입니다. 다음은 두 datetime 오브젝트의 차이를 구한 것입니다.
diff1 = t1 - t2
print(diff1)
print(type(diff1))
17669 days, 13:27:39.736037
<class 'datetime.timedelta'>
diff2 = t2 - t1
print(diff2)
print(type(diff2))
-17670 days, 10:32:20.263963
<class 'datetime.timedlta'>datetime 오브젝트로 변환하기 - to_datetime 메서드
경우에 따라서는 시계열 데이터를 문자열로 저장해야 할 때도 있습니다. 하지만 문자열은 시간 계산을 할 수 없기 때문에 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):
Date 122 non-null object
...
Deaths_Spain 16 non-null float64
Deaths_Mali 12 non-null float64
dtypes: float64(16), int64(1), object(1)
memory usage: 17.2+ KB
None3. 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):
Date 122 non-null object
Day 122 non-null object
...
date_dt 122 non-null datetime64[ns]
dtypes: datetime64[ns](1), float64(16), int64(1), object(1)
memory usage: 18.2+ KB
None4. to_datetime 메서드를 좀 더 자세히 알아볼까요? 시간 형식 지정자(%d, %m, %y)와 기호(/, -)를 적절히 조합하여 format 인자에 전달하면 그 형식에 맞게 정리된 datetime 오브젝트를 얻을 수 있습니다. 다음 실습을 참고하여 format 인자의 사용법을 꼭 익혀두세요.
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시간 형식 지정자
다음은 시간 형식 지정자를 정리한 표입니다. 이 장의 실습에서 종종 사용하므로 한 번 읽고 넘어가기 바랍니다.
시간 형식 지정자
시간 형식 지정자 의미 결과 %a 요일 출력 Sun, Mon, ... Sat %A 요일 출력(긴 이름) Sunday, Monday, ..., Saturday %w 요일 출력(숫자, 0부터 일요일) 0, 1, ..., 6 %d 날짜 출력(2자리로 표시) 01, 02, ..., 31 %b 월 출력 Jan, Feb, ..., Dec %B 퉐 출력(긴 이름) January, Febuary, ..., December %m 월 출력(숫자) 01, 02, ..., 12 %y 년 출력(2자리로 표시) 00, 01, ..., 99 %Y 년 출력(4자리로 표시) 0001, 0002, ..., 2013, 2014, ..., 9999 %H 시간 출력(24시간) 00, 01, ..., 23 %l 시간 출력(12시간) 01, 02, ..., 12 %p AM 또는 PM 출력 AM, PM %M 분 출력(2자리로 표시) 00, 01, ..., 59 %S 초 출력(2자리로 출력) 00, 01, ..., 59 %f 마이크로초 출력 000000, 000001, ..., 999999 %z UTC 차이 출력(+HHMM이나 -HHMM 형태) (None), +0000, -0400, +1030 %Z 기준 지역 이름 출력 (None), UTC, EST, CST %j 올해의 지난 일 수 출력(1일, 2일, ...) 001, 002, ..., 366 %U 올해의 지난 주 수 출력(1주, 2주, ...) 00, 01, ..., 53 %c 날짜와 시간 출력 Tue Aug 16 21:30:00 1988 %x 날짜 출력 08/16/88 (None);08/16/1988 %X 시간 출력 21:30:00 %G 년 출력(ISO 8601 형식) 0001, 0002, ..., 2013, 2014, ..., 9999 %u 요일 출력(ISO 8601 형식) 1, 2, ..., 7 %V 올해의 지난 주 수 출력(ISO 8601 형식) 01, 02, ..., 53 *시계열 데이터를 구분해서 추출하고 싶어요
now 메서드로 얻은 현재 시간의 시계열 데이터는 아주 정밀한 단위까지 시간을 표현합니다. 하지만 원하는 시계열 데이터의 시간 요소가 연도, 월, 일뿐이라면 now 메서드로 얻은 시계열 데이터를 잘라내야 합니다. 다음은 strftime 메서드와 시간 형식 지정자를 이용하여 시계열 데이터를 잘라낸 것입니다.
now = datetime.now( )
print(now)
2018-05-19 13:27:44.959433
nowDate = now.strftime('%Y-%m-%d')
print(nowDate)
2018-05-19
nowTime = now.strftime('%H:%M:%S')
print(nowTime)
13:27:44
nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
print(nowDatetime)
2018-05-19 13:27:44datetime 오브젝트로 변환하기 - 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(ebola.info( ))
<class 'pandas.core.frame.DataFrame'>>
RangeIndex: 122 entries, 0 to 121
Data columns (total 18 columns):
Date 122 non-null datetime64[ns]
...
dtypes: datetime64[ns](1), float64(16), int64(1)
memory usage: 17.2+ KB
Nonedatetime 오브젝트에서 날짜 정보 추출하기
datetime 오브젝트에는 년, 월, 일과 같은 날짜 정보를 따로 저장하고 있는 속성이 이미 준비되어 있습니다. 다음 실습을 통해 datetime 오브젝트에서 날짜 정보를 하나씩 추출해 보겠습니다.
datetime 오브젝트에서 날짜 정보 추출하기
1. 다음은 문자열로 저장된 날짜를 시리즈에 담아 datetime 오브젝트로 변환한 것입니다.
date_series = pd.Series(['2018-02-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)
2018
print(d1[0].month)
5
print(d1[0].day)
16dt 접근자 사용하기
문자열을 처리하려면 str 접근자를 사용한 다음 문자열 속성이나 메서드를 사용해야 했습니다. datetime 오브젝트도 마찬가지로 dt 접근자를 사용하면 datetime 속성이나 메서드를 사용하여 시계열 데이터를 처리할 수 있습니다.
dt 접근자로 시계열 데이터 정리하기
1. 먼저 ebola 데이터 집합을 불러온 다음 Date 열을 datetime 오브젝트로 변환하여 새로운 열(date_dt)로 추가합니다.
ebola = pd.read_csv('../data/country_timeseries.csv')
ebola['date_dt'] = pd.to_datetime(ebola['Date'])2. 다음은 dt 접근자를 사용하지 않고 인덱스가 3인 데이터의 년, 월, 일 데이터를 추출한 것입니다.
print(ebola[['Date', 'date_dt']].head( ))
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
print(ebola['date_dt'][3].year)
2015
print(ebola['date_dt'][3].month)
1
print(ebola['date_dt'][3].day)
23. 과정 2와 같은 방법은 date_dt 열의 특정 데이터를 인덱스로 접근해야 하기 때문에 불편합니다. 다음은 dt 접근자로 date_dt 열에 한 번에 접근한 다음 year 속성을 이용하여 연도값을 추출한 것입니다. 추출한 연도값은 ebola 데이터프레임의 새로운 열(year)로 추가했습니다.
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 20144. 다음은 과정 3을 응용하여 월, 일 데이터를 한 번에 추출해서 새로운 열(month, day)로 추가한 것입니다.
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 315. 오른쪽은 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):
Date 122 non-null datetime64[ns]
Day 122 non-null int64
...
date_dt 122 non-null datetime64[ns]
year 122 non-null int64
month 122 non-null int64
day 122 non-null int64
dtypes: datetime64[ns](2), float64(16), int64(4)
memory usage: 21.0+ KB
None출처 : "판다스 입문"
'Do it! 판다스 입문' 카테고리의 다른 글
Chapter 12-2 사례별 시계열 데이터 계산하기_2 (0) 2022.06.26 Chapter 12-2 사례별 시계열 데이터 계산하기_1 (0) 2022.06.26 Chapter 11-3~11-4 데이터 필터링, 그룹 오브젝트 (0) 2022.06.25 Chapter 11-1~11-2 데이터 집계, 데이터 변환 (0) 2022.06.25 Chapter 10 apply 메서드 활용 (0) 2022.06.25