(Python) datetime 모듈
제목
파이썬의 datetime 모듈은 날짜와 시간을 표현하는데 사용되는 다양한 기능을 제공합니다. 시간으로 기록된 데이터를 분석할때 매우 편리하여 자주 사용됩니다.
datetime : 특정 날짜/시간을 생성하기
생성하고자 하는 시간을 인자로 전달하여 datetime 객체를 생성할 수 있습니다.
from datetime import datetime
t1 = datetime.now()
t2 = datetime(1988, 1, 1)
t3 = datetime(1988, 12, 25, 14, 25, 30)
print('t1: ', t1)
print('t2: ', t2)
print('t3: ', t3)
'''
t1: 2020-10-18 14:09:49.625226
t2: 1988-01-01 00:00:00
t3: 1988-12-25 14:25:30
'''
to_datetime : 문자열을 datetime 자료형으로 변환하기
시간 데이터가 문자열로 저장되어 있을때, 시간 계산을 하기 위해서는 datetime 자료형으로 변환해 주어야 합니다.
시간 데이터가 문자열로 저장된 데이터프레임 예제를 가져오겠습니다.
import pandas as pd
ebola = pd.read_csv('country_timeseries.csv')
print(ebola.iloc[:, 0:4].head())
'''
Date Day Cases_Guinea Cases_Liberia
0 1/5/2015 289 2776.0 NaN
1 1/4/2015 288 2775.0 NaN
2 1/3/2015 287 2769.0 8166.0
3 1/2/2015 286 NaN 8157.0
4 12/31/2014 284 2730.0 8115.0
'''
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
'''
날짜를 나타내는 Date 열이 문자형으로 저장되어 있음을 확인 할 수 있습니다.
to_datetime
메서드를 사용해 Date열의 자료형을 datetime으로 변환하겠습니다.
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
'''
Date열을 datetime형으로 변환 후, Date_dt란 새로운 열로 추가하였습니다.
Date_dt 열이 datetime 자료형으로 나타나는 걸 확인 할 수 있습니다.
format : 시간 형식 지정
to_datetime
메서드에 format 속성을 전달하면 원하는 형식대로 정리된 datetime 객체를 생성합니다.
시간 형식 지정자 ($d, $m, $y)와 기호 (/, -)을 조합하여 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')
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
'''
fomat 속성에 지정한 형식대로 datetime 객체가 생성되었음을 확인 할 수 있습니다.
strftime : 시계열 데이터 잘라내기
strftime
메서드는 시계열 데이터의 원하는 요소를 잘라내줍니다. 연도, 월, 일, 시, 분, 초 중에서 원하는 요소를 골라낼 수 있습니다.
now = datetime.now()
print(now)
nowDate = now.strftime('%Y-%m-%d')
print('Current Date: ', nowDate)
nowTime = now.strftime('%H:%M:%S')
print('Current Time: ', nowTime)
nowDateTime = now.strftime('%Y-%m-%d %H:%M:%S')
print('Current Date, Time: ', nowDateTime)
'''
2020-10-18 14:49:59.230060
Current Date: 2020-10-18
Current Time: 14:49:59
Current Date, Time: 2020-10-18 14:49:59
'''
날짜 데이터 분리
datetime 객체의 year, month, day 속성을 이용해 년, 월, 일 정보를 추출할 수 있습니다.
date_series = pd.Series(['2020-05-16', '2020-05-17', '2020-05-18'])
d1 = pd.to_datetime(date_series)
d1
'''
0 2020-05-16
1 2020-05-17
2 2020-05-18
dtype: datetime64[ns]
'''
print(d1[0].year)
# 2020
print(d1[1].month)
# 5
print(d1[2].day)
# 18
dt 접근자
dt 접근자를 이용하면 datetime 속성, 메서드를 이용해 시계열 데이터를 다룰 수 있습니다.
ebola['year'] = ebola['Date_dt'].dt.year
ebola[['Date', 'Date_dt', 'year']]
'''
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
... ... ... ...
117 3/27/2014 2014-03-27 2014
118 3/26/2014 2014-03-26 2014
119 3/25/2014 2014-03-25 2014
120 3/24/2014 2014-03-24 2014
121 3/22/2014 2014-03-22 2014
'''
dt 접근자로 Date_dt 열에 접근하여 연도값을 추출하여 새로운 year 열을 생성하였습니다.
ebola['month'] = ebola['Date_dt'].dt.month
ebola['day'] = ebola['Date_dt'].dt.day
ebola[['year', 'month', 'day']]
'''
year month day
0 2015 1 5
1 2015 1 4
2 2015 1 3
3 2015 1 2
4 2014 12 31
... ... ... ...
117 2014 3 27
118 2014 3 26
119 2014 3 25
120 2014 3 24
121 2014 3 22
122 rows × 3 columns
'''
마찬가지 방법으로 month, day 열을 추가할 수 있습니다.
날짜 인덱싱
datetime 객체를 인덱싱하여 원하는 데이터를 추출할 수 있습니다.
tesla = pd.read_csv('TSLA.csv', parse_dates=['Date'])
tesla.index = tesla.Date
tesla.head()
'''
Date Open High Low Close Adj Close Volume
Date
2010-06-29 2010-06-29 19.000000 25.00 17.540001 23.889999 23.889999 18766300
2010-06-30 2010-06-30 25.790001 30.42 23.299999 23.830000 23.830000 17187100
2010-07-01 2010-07-01 25.000000 25.92 20.270000 21.959999 21.959999 8218800
2010-07-02 2010-07-02 23.000000 23.10 18.709999 19.200001 19.200001 5139800
2010-07-06 2010-07-06 20.000000 20.00 15.830000 16.110001 16.110001 6866900
'''
tesla['2017'].head()
'''
Date Open High Low Close Adj Close Volume
Date
2017-01-03 2017-01-03 214.860001 220.330002 210.960007 216.990005 216.990005 5923300
2017-01-04 2017-01-04 214.750000 228.000000 214.309998 226.990005 226.990005 11213500
2017-01-05 2017-01-05 226.419998 227.479996 221.949997 226.750000 226.750000 5911700
2017-01-06 2017-01-06 226.929993 230.309998 225.449997 229.009995 229.009995 5527900
2017-01-09 2017-01-09 228.970001 231.919998 228.000000 231.279999 231.279999 3979500
'''
2017년도의 데이터만 추출된 것을 확인 할 수 있습니다.