728x90
to_datetime()
- 판다스를 이용한 데이터 타입 변환중 날짜에 관한 함수
- 주식 데이터 중 날짜데이터들 증권사 api로 받아와 DataFrame에 저장한 후에 csv파일로 저장하면 날짜데이터의 형식은 int64로 지정되어 저장됩니다.
- 이를 datetime64형식으로 변환 하는 방법
날짜 형식 변환
- 증권사 API를 이용하여 주식 데이터를 년/월/일/주/시/분 단위로 받을 수 있습니다.
- 주식 데이터의 시가/고가/저가/종가 등 세부 데이터들은 날짜별로 기록되어 있습니다.
- 이때 날짜를 원본 그대로 저장하게 되면 데이터 타입은 정수(int)형으로 저장되고, DataFrame으로 변환 후 csv에 저장 하게 괴면 Dtype은 int64로 저장 되게 됩니다.
- 이 형식을 Datatime형식으로 바꾸어 시계열 데이터 처리가 가능하게 만들어야 합니다.
Import Pandas
- 판다스 모듈을 임포트 합니다.
import pandas as pd
csv 파일 읽기
- 판다스의 read_csv 함수를 사용하여 테스트 해볼 csv파일의 데이터들을 읽어와 DataFrame 형식으로 변수 df에 저장합니다.
df = pd.read_csv('./DA000020.csv')
데이터 확인
- 변수 df에 저장된 데이터를 확인합니다.
- head() 함수를 사용하여 상위 3개의 데이터를 확인해봅니다.
- info() 함수를 통해서 데이터프레임안의 데이터들의 데이터 형식과 Non-Null 값들을 확인해 봅니다.
- column 'date'에 저장된 날짜 데이터의 Dtype이 int64 정수형으로 되어 있는것을 확인 할 수 있습니다.
df.head(3)
date | time | start | high | low | close | prev | volume | tr_amount | sales_qu | ... | fr_cu_holding | fr_cu_ratio | ad_pr_ratio | in_net_buy | up_do | up_do_ratio | deposit | st_turnover | tr_es_ratio | sign | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20200916 | 0 | 24850 | 25700 | 24700 | 25050 | -350 | 678492 | 17013000000 | 387608 | ... | 1033709 | 3.70 | 100.0 | 1043 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
1 | 20200915 | 0 | 26200 | 26950 | 25300 | 25400 | -900 | 911902 | 23800000000 | 512367 | ... | 1033709 | 3.70 | 100.0 | -11779 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
2 | 20200914 | 0 | 26850 | 26850 | 25450 | 26300 | -450 | 809547 | 21287000000 | 445602 | ... | 1047107 | 3.75 | 100.0 | 6928 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
3 rows × 23 columns
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10928 entries, 0 to 10927
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 10928 non-null int64
1 time 10928 non-null int64
2 start 10928 non-null int64
3 high 10928 non-null int64
4 low 10928 non-null int64
5 close 10928 non-null int64
6 prev 10928 non-null int64
7 volume 10928 non-null int64
8 tr_amount 10928 non-null int64
9 sales_qu 10928 non-null int64
10 purchase_qu 10928 non-null int64
11 li_share 10928 non-null int64
12 market_cap 10928 non-null int64
13 fr_cu_holding 10928 non-null int64
14 fr_cu_ratio 10928 non-null float64
15 ad_pr_ratio 10928 non-null float64
16 in_net_buy 10928 non-null int64
17 up_do 10928 non-null int64
18 up_do_ratio 10928 non-null float64
19 deposit 10928 non-null int64
20 st_turnover 10928 non-null float64
21 tr_es_ratio 10928 non-null float64
22 sign 10928 non-null int64
dtypes: float64(5), int64(18)
memory usage: 1.9 MB
date 컬럼의 데이터 타입 변환
- 먼저 int64로 되어있는 date컬럼의 데이터 타입을 문자열 형식으로 변환해 줍니다.
- 데이터프레임 정보에서 Dtype이 object로 되어있는 컬럼의 데이터 타입은 문자열과 같습니다.
- astype() 함수를 통해서 데이터 타입을 문자열로 변환하고, 다시 info()로 확인해봅니다.
df['date']= df['date'].astype('str')
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10928 entries, 0 to 10927
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 10928 non-null object
1 time 10928 non-null int64
2 start 10928 non-null int64
3 high 10928 non-null int64
4 low 10928 non-null int64
5 close 10928 non-null int64
6 prev 10928 non-null int64
7 volume 10928 non-null int64
8 tr_amount 10928 non-null int64
9 sales_qu 10928 non-null int64
10 purchase_qu 10928 non-null int64
11 li_share 10928 non-null int64
12 market_cap 10928 non-null int64
13 fr_cu_holding 10928 non-null int64
14 fr_cu_ratio 10928 non-null float64
15 ad_pr_ratio 10928 non-null float64
16 in_net_buy 10928 non-null int64
17 up_do 10928 non-null int64
18 up_do_ratio 10928 non-null float64
19 deposit 10928 non-null int64
20 st_turnover 10928 non-null float64
21 tr_es_ratio 10928 non-null float64
22 sign 10928 non-null int64
dtypes: float64(5), int64(17), object(1)
memory usage: 1.9+ MB
- date 컬럼의 Dtype이 object로 변환 된 것을 확인할 수 있습니다.
- astype()함수를 사용하여 데이터 타입을 변환할 때 기존의 데이터 프레임에 반영 시키지 않으면 새로운 시리즈로 생성되기때문에 데이터 타입이 변환된 기존의 데이터 프레임을 계속적으로 사용하기 위해서 df['date'] 에 반영시켜 주어야 합니다.
Datetime 형식으로 변환
- 데이터 타입을 Datetime 형식으로 변환하는 방법은 크게 2가지가 있습니다.
-
- 판다스의 to_datetime() 함수를 이용한 방법
-
- 판다스의 apply() 함수를 이용해 datetime 모듈을 이용한 방법
- 위 2가지 방법을 이용해 위에서 문자열 형식으로 변환한 데이터들을 Datetime형식으로 변환 해 보겠습니다.
to_datetime() 함수를 이용한 방법
- to_datetime() 함수의 argument로 df의 date컬럼을 넘겨줍니다.
pd.to_datetime(df['date'])
0 2020-09-16
1 2020-09-15
2 2020-09-14
3 2020-09-11
4 2020-09-10
...
10923 1980-01-09
10924 1980-01-08
10925 1980-01-07
10926 1980-01-05
10927 1980-01-04
Name: date, Length: 10928, dtype: datetime64[ns]
- 20200916...으로 저장되어있던 데이터들이 2020-09-16으로 변환 되고, dtype이 datetime64로 변환 된 것을 확인할 수 있습니다.
- info()함수와 head()함수를 사용하여 데이터 프레임의 정보를 확인해보겠습니다.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10928 entries, 0 to 10927
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 10928 non-null object
1 time 10928 non-null int64
2 start 10928 non-null int64
3 high 10928 non-null int64
4 low 10928 non-null int64
5 close 10928 non-null int64
6 prev 10928 non-null int64
7 volume 10928 non-null int64
8 tr_amount 10928 non-null int64
9 sales_qu 10928 non-null int64
10 purchase_qu 10928 non-null int64
11 li_share 10928 non-null int64
12 market_cap 10928 non-null int64
13 fr_cu_holding 10928 non-null int64
14 fr_cu_ratio 10928 non-null float64
15 ad_pr_ratio 10928 non-null float64
16 in_net_buy 10928 non-null int64
17 up_do 10928 non-null int64
18 up_do_ratio 10928 non-null float64
19 deposit 10928 non-null int64
20 st_turnover 10928 non-null float64
21 tr_es_ratio 10928 non-null float64
22 sign 10928 non-null int64
dtypes: float64(5), int64(17), object(1)
memory usage: 1.9+ MB
df.head(3)
date | time | start | high | low | close | prev | volume | tr_amount | sales_qu | ... | fr_cu_holding | fr_cu_ratio | ad_pr_ratio | in_net_buy | up_do | up_do_ratio | deposit | st_turnover | tr_es_ratio | sign | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20200916 | 0 | 24850 | 25700 | 24700 | 25050 | -350 | 678492 | 17013000000 | 387608 | ... | 1033709 | 3.70 | 100.0 | 1043 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
1 | 20200915 | 0 | 26200 | 26950 | 25300 | 25400 | -900 | 911902 | 23800000000 | 512367 | ... | 1033709 | 3.70 | 100.0 | -11779 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
2 | 20200914 | 0 | 26850 | 26850 | 25450 | 26300 | -450 | 809547 | 21287000000 | 445602 | ... | 1047107 | 3.75 | 100.0 | 6928 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
3 rows × 23 columns
- 데이터 프레임 정보와 데이터를 확인해보면 Datetime으로 변환되지 않았음을 확인할 수 있습니다.
- to_datetime() 함수를 사용하면 astype()함수와 마찬가지로 기존의 데이터프레임 또는 컬럼 시리즈에 반영해 주여야 합니다.
- df['date']에 to_datetime()함수로 변환된 데이터들을 반영하고 다시 한번 데이터 프레임 정보를 확인해 보겠습니다.
df['date'] = pd.to_datetime(df['date'])
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10928 entries, 0 to 10927
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 10928 non-null datetime64[ns]
1 time 10928 non-null int64
2 start 10928 non-null int64
3 high 10928 non-null int64
4 low 10928 non-null int64
5 close 10928 non-null int64
6 prev 10928 non-null int64
7 volume 10928 non-null int64
8 tr_amount 10928 non-null int64
9 sales_qu 10928 non-null int64
10 purchase_qu 10928 non-null int64
11 li_share 10928 non-null int64
12 market_cap 10928 non-null int64
13 fr_cu_holding 10928 non-null int64
14 fr_cu_ratio 10928 non-null float64
15 ad_pr_ratio 10928 non-null float64
16 in_net_buy 10928 non-null int64
17 up_do 10928 non-null int64
18 up_do_ratio 10928 non-null float64
19 deposit 10928 non-null int64
20 st_turnover 10928 non-null float64
21 tr_es_ratio 10928 non-null float64
22 sign 10928 non-null int64
dtypes: datetime64[ns](1), float64(5), int64(17)
memory usage: 1.9 MB
df.head(3)
date | time | start | high | low | close | prev | volume | tr_amount | sales_qu | ... | fr_cu_holding | fr_cu_ratio | ad_pr_ratio | in_net_buy | up_do | up_do_ratio | deposit | st_turnover | tr_es_ratio | sign | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2020-09-16 | 0 | 24850 | 25700 | 24700 | 25050 | -350 | 678492 | 17013000000 | 387608 | ... | 1033709 | 3.70 | 100.0 | 1043 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
1 | 2020-09-15 | 0 | 26200 | 26950 | 25300 | 25400 | -900 | 911902 | 23800000000 | 512367 | ... | 1033709 | 3.70 | 100.0 | -11779 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
2 | 2020-09-14 | 0 | 26850 | 26850 | 25450 | 26300 | -450 | 809547 | 21287000000 | 445602 | ... | 1047107 | 3.75 | 100.0 | 6928 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
3 rows × 23 columns
- 다시 확인해본 데이터 프레임 정보와 데이터들을 보면 변환된 형식이 잘 반영된 것을 볼 수 있습니다.
apply() 함수를 이용한 방법
- 다른 방법으로는 apply() 함수를 이용한 방법이 있습니다.
- 판다스의 apply()함수는 argument로 특정 함수와 데이터들을 넘겨주게 되면 결과값들이 반영되게 됩니다.
- datetime 모듈을 import시켜서 문자열로된 데이터들을 Datetime형식으로 변환 해 보겠습니다.
from datetime import datetime
df = pd.read_csv('./DA000020.csv')
df['date']= df['date'].astype('str')
df['date'].apply(lambda _ : datetime.strptime(_,'%Y%m%d'))
0 2020-09-16
1 2020-09-15
2 2020-09-14
3 2020-09-11
4 2020-09-10
...
10923 1980-01-09
10924 1980-01-08
10925 1980-01-07
10926 1980-01-05
10927 1980-01-04
Name: date, Length: 10928, dtype: datetime64[ns]
- apply() 함수에 lambda 식을 통해서 데이터형식이 변환 된 것을 확인 할 수 있습니다.
- 데이터 프레임 정보를 확인해 보겠습니다.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10928 entries, 0 to 10927
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 10928 non-null object
1 time 10928 non-null int64
2 start 10928 non-null int64
3 high 10928 non-null int64
4 low 10928 non-null int64
5 close 10928 non-null int64
6 prev 10928 non-null int64
7 volume 10928 non-null int64
8 tr_amount 10928 non-null int64
9 sales_qu 10928 non-null int64
10 purchase_qu 10928 non-null int64
11 li_share 10928 non-null int64
12 market_cap 10928 non-null int64
13 fr_cu_holding 10928 non-null int64
14 fr_cu_ratio 10928 non-null float64
15 ad_pr_ratio 10928 non-null float64
16 in_net_buy 10928 non-null int64
17 up_do 10928 non-null int64
18 up_do_ratio 10928 non-null float64
19 deposit 10928 non-null int64
20 st_turnover 10928 non-null float64
21 tr_es_ratio 10928 non-null float64
22 sign 10928 non-null int64
dtypes: float64(5), int64(17), object(1)
memory usage: 1.9+ MB
df.head()
date | time | start | high | low | close | prev | volume | tr_amount | sales_qu | ... | fr_cu_holding | fr_cu_ratio | ad_pr_ratio | in_net_buy | up_do | up_do_ratio | deposit | st_turnover | tr_es_ratio | sign | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20200916 | 0 | 24850 | 25700 | 24700 | 25050 | -350 | 678492 | 17013000000 | 387608 | ... | 1033709 | 3.70 | 100.0 | 1043 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
1 | 20200915 | 0 | 26200 | 26950 | 25300 | 25400 | -900 | 911902 | 23800000000 | 512367 | ... | 1033709 | 3.70 | 100.0 | -11779 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
2 | 20200914 | 0 | 26850 | 26850 | 25450 | 26300 | -450 | 809547 | 21287000000 | 445602 | ... | 1047107 | 3.75 | 100.0 | 6928 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
3 | 20200911 | 0 | 28200 | 29600 | 26150 | 26750 | 800 | 3734243 | 102865000000 | 2067694 | ... | 1030910 | 3.69 | 100.0 | -12607 | 0 | 0.0 | 0 | 0.0 | 0.0 | 50 |
4 | 20200910 | 0 | 25500 | 26100 | 24700 | 25950 | 1400 | 1809380 | 46235000000 | 867366 | ... | 1045379 | 3.74 | 100.0 | 18241 | 0 | 0.0 | 0 | 0.0 | 0.0 | 50 |
5 rows × 23 columns
- 확인해 보면 기존의 데이터 프레임에 반영 되지 않은 것을 확인 할 수 있습니다.
- apply() 도 to_datetimte()과 마찬가지로 새로운 시리즈로 만들어 지기 때문에 기존의 데이터 프레임에 반영시켜 주어야합니다.
df['date']=df['date'].apply(lambda _ : datetime.strptime(_,'%Y%m%d'))
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10928 entries, 0 to 10927
Data columns (total 23 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 10928 non-null datetime64[ns]
1 time 10928 non-null int64
2 start 10928 non-null int64
3 high 10928 non-null int64
4 low 10928 non-null int64
5 close 10928 non-null int64
6 prev 10928 non-null int64
7 volume 10928 non-null int64
8 tr_amount 10928 non-null int64
9 sales_qu 10928 non-null int64
10 purchase_qu 10928 non-null int64
11 li_share 10928 non-null int64
12 market_cap 10928 non-null int64
13 fr_cu_holding 10928 non-null int64
14 fr_cu_ratio 10928 non-null float64
15 ad_pr_ratio 10928 non-null float64
16 in_net_buy 10928 non-null int64
17 up_do 10928 non-null int64
18 up_do_ratio 10928 non-null float64
19 deposit 10928 non-null int64
20 st_turnover 10928 non-null float64
21 tr_es_ratio 10928 non-null float64
22 sign 10928 non-null int64
dtypes: datetime64[ns](1), float64(5), int64(17)
memory usage: 1.9 MB
df.head()
date | time | start | high | low | close | prev | volume | tr_amount | sales_qu | ... | fr_cu_holding | fr_cu_ratio | ad_pr_ratio | in_net_buy | up_do | up_do_ratio | deposit | st_turnover | tr_es_ratio | sign | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2020-09-16 | 0 | 24850 | 25700 | 24700 | 25050 | -350 | 678492 | 17013000000 | 387608 | ... | 1033709 | 3.70 | 100.0 | 1043 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
1 | 2020-09-15 | 0 | 26200 | 26950 | 25300 | 25400 | -900 | 911902 | 23800000000 | 512367 | ... | 1033709 | 3.70 | 100.0 | -11779 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
2 | 2020-09-14 | 0 | 26850 | 26850 | 25450 | 26300 | -450 | 809547 | 21287000000 | 445602 | ... | 1047107 | 3.75 | 100.0 | 6928 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
3 | 2020-09-11 | 0 | 28200 | 29600 | 26150 | 26750 | 800 | 3734243 | 102865000000 | 2067694 | ... | 1030910 | 3.69 | 100.0 | -12607 | 0 | 0.0 | 0 | 0.0 | 0.0 | 50 |
4 | 2020-09-10 | 0 | 25500 | 26100 | 24700 | 25950 | 1400 | 1809380 | 46235000000 | 867366 | ... | 1045379 | 3.74 | 100.0 | 18241 | 0 | 0.0 | 0 | 0.0 | 0.0 | 50 |
5 rows × 23 columns
- 데이터 타입을 Datetime으로 변환하는 방법에 대해서 알아 봤습니다.
- 2가지 방법 중 apply()함수를 사용한 방법이 성능이 좀 더 좋다는 의견도 있습니다.
- 개인의 취향에 맞게 선택하여 사용하면 좋을 것 같습니다.
모듈화
- 위의 과정들을 함수로 만들어 모듈로 사용해 보겠습니다.
def transform_datetype(df):
df['date'] = df['date'].astype('str')
df['date'] = pd.to_datetime(df['date'])
return df
df = pd.read_csv('./DA000020.csv')
df = transform_datetype(df)
df
date | time | start | high | low | close | prev | volume | tr_amount | sales_qu | ... | fr_cu_holding | fr_cu_ratio | ad_pr_ratio | in_net_buy | up_do | up_do_ratio | deposit | st_turnover | tr_es_ratio | sign | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2020-09-16 | 0 | 24850 | 25700 | 24700 | 25050 | -350 | 678492 | 17013000000 | 387608 | ... | 1033709 | 3.70 | 100.00 | 1043 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
1 | 2020-09-15 | 0 | 26200 | 26950 | 25300 | 25400 | -900 | 911902 | 23800000000 | 512367 | ... | 1033709 | 3.70 | 100.00 | -11779 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
2 | 2020-09-14 | 0 | 26850 | 26850 | 25450 | 26300 | -450 | 809547 | 21287000000 | 445602 | ... | 1047107 | 3.75 | 100.00 | 6928 | 0 | 0.0 | 0 | 0.0 | 0.0 | 53 |
3 | 2020-09-11 | 0 | 28200 | 29600 | 26150 | 26750 | 800 | 3734243 | 102865000000 | 2067694 | ... | 1030910 | 3.69 | 100.00 | -12607 | 0 | 0.0 | 0 | 0.0 | 0.0 | 50 |
4 | 2020-09-10 | 0 | 25500 | 26100 | 24700 | 25950 | 1400 | 1809380 | 46235000000 | 867366 | ... | 1045379 | 3.74 | 100.00 | 18241 | 0 | 0.0 | 0 | 0.0 | 0.0 | 50 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
10923 | 1980-01-09 | 0 | 5700 | 5740 | 5700 | 5700 | 410 | 190 | 0 | 0 | ... | 0 | 0.00 | 6.59 | 0 | 0 | 0.0 | 0 | 0.0 | 0.0 | 32 |
10924 | 1980-01-08 | 0 | 5290 | 5290 | 5290 | 5290 | 300 | 0 | 0 | 0 | ... | 0 | 0.00 | 6.59 | 0 | 0 | 0.0 | 0 | 0.0 | 0.0 | 32 |
10925 | 1980-01-07 | 0 | 4990 | 4990 | 4990 | 4990 | 290 | 120 | 0 | 0 | ... | 0 | 0.00 | 6.59 | 0 | 0 | 0.0 | 0 | 0.0 | 0.0 | 32 |
10926 | 1980-01-05 | 0 | 4700 | 4700 | 4700 | 4700 | 0 | 0 | 0 | 0 | ... | 0 | 0.00 | 6.59 | 0 | 0 | 0.0 | 0 | 0.0 | 0.0 | 32 |
10927 | 1980-01-04 | 0 | 4700 | 4700 | 4700 | 4700 | 3650 | 0 | 0 | 0 | ... | 0 | 0.00 | 6.59 | 0 | 0 | 0.0 | 0 | 0.0 | 0.0 | 32 |
10928 rows × 23 columns
728x90
'programming language > Python' 카테고리의 다른 글
[Python] Colab Selenium - 코랩 셀리니움 사용법 (0) | 2020.11.26 |
---|---|
[Python] 파이썬 넘파이 (Numpy) - numpy.log1p() / numpy.expm1() (0) | 2020.10.22 |
[Python] 넘파이 (Numpy) - 공부하기_Numpy.c_ .2 (0) | 2020.10.20 |
[Python] 넘파이 (Numpy) - 공부하기_random sampling.1 (0) | 2020.10.20 |
[python] 파이썬 판다스 - python pandas - pd.cut() (0) | 2020.10.12 |