(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년도의 데이터만 추출된 것을 확인 할 수 있습니다.