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가지가 있습니다.
    1. 판다스의 to_datetime() 함수를 이용한 방법
    1. 판다스의 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

+ Recent posts