HAZEL

1. Pandas - Datetime() 한번에 정리하기 본문

DATA ANALYSIS/Python with Data

1. Pandas - Datetime() 한번에 정리하기

Rmsid01 2021. 1. 20. 14:10

시계열 데이터를 만지다 보면, 자연스럽게 datetime 으로 datatype을 바꾸고 다양하게 이용한다.  

항상 헷갈리고 까먹기 때문에, 블로그에 정리하려고 한다!

 

1. int(str) -> Datetime 으로 변환하기 

 변환하는 방법은 크게 두가지가 있다. 1. pandas 함수를 이용하기. 2. datetime 함수를 이용하기.

 

0.0. 데이터 불러오기

: 데이터 타임으로 바꿀 데이터를 불러온다. 

: 나는 int 로 되어있는 데이터를 가지고 왔다. 

- 데이콘 공모전에서 얻은 데이터를 time 데이터만 따로 저장해서 가져왔다. 

 

import pandas as pd
data = pd.read_csv('datatime_exa.csv')
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5429 entries, 0 to 5428
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   time    5429 non-null   int64
dtypes: int64(1)
memory usage: 42.5 KB

 

1.1. Pandas - to_datetime()을 이용하는 방법

1. int 를 str 으로 바꾸준다. < .astype('str')  > 이용하면, str으로 타입이 변환된다.

2. pd.to_datetime( ) 을 이용한다.

data['time'] = data['time'].astype('str')
data['time'] =  pd.to_datetime(data['time'])

 

1.2. datetime - datetime.datetime.strptime() 을 이용하는 방법

1. int 를 str 으로 바꾸준다. < .astype('str')  > 이용하면, str으로 타입이 변환된다.

2. 연/월/일 만 반환할 수 있도록 문자를 슬라이싱 해준다.

3. lambda 함수 / datetime.datetime.strptime()을 이용한다.

 

import datetime #  from datetime import datetime 이렇게 쓰게되면, 아래에른 그냥 datetime 만 불러와도 됨
data['time'] = data['time'].astype('str')
data.time = data.time.str[:8]
data['time'] = data['time'].apply(lambda _ : datetime.datetime.strptime(_, '%Y%m%d'))

 

** 내가 마주한 에러들 

1. 년/월/일 은 잘만되는 코드가 시/분/초 할때는 에러가 등장한다.

: 위에서 굳이 슬라이싱을 해서, 년/월/일 만 반영한 이유는 '에러' 때문이다. 슬라이싱을 하지않고, 그냥 아래 코드를 입력하면 에러가 발생한다.

 

import datetime
data['time'] = data['time'].astype('str')
data['time'].apply(lambda _ : datetime.datetime.strptime(_, '%Y-%m-%d %H:%M:%S'))

 

이러한 에러를 해결하기 위해, 1번. 위의 방법처럼 년/월/일 만 사용한다. 

하지만 꼭 시/분/초 도 데이터 타임으로 바꾸고 싶다면 다른 방법을 사용한다.

바로 문자 형식을  '%Y-%m-%d %H:%M:%S' 로 바꿔주는 것이다.

 

data['time'] = data['time'].astype('str')
data['time'] = data['time'].apply(lambda x : x[0:4]+'-'+x[4:6] +'-'+ x[6:8]+ ' '+x[8:10]+ ':'+x[10:12]+ ':'+x[12:14])
data['time'] = data['time'].apply(lambda _ : datetime.datetime.strptime(_, '%Y-%m-%d %H:%M:%S'))

 

이 때, lambda 함수를 사용해서 datetime.strptime 을 사용하는데, 그 이유는 바꾸고 싶은 time 컬럼의 형식은 'Series'이기 때문이다. 만약 lambda함수를 사용하지 않고 그냥 넣는다면 아래와 같은 에러가 발생한다.

 

data['time'] = data['time'].astype('str')
data['time'] = data['time'].apply(lambda x : x[0:4]+'-'+x[4:6] +'-'+ x[6:8]+ ' '+x[8:10]+ ':'+x[10:12]+ ':'+x[12:14])
data['time'] = datetime.strptime(data['time'], '%Y-%m-%d %H:%M:%S')

 

만약, lambda를 사용하기 싫다면 그냥 1.1. 방법처럼 pd.datetime() 을 사용해도 된다.

data = pd.read_csv('datatime_exa.csv')
data['time'] = data['time'].astype('str')
data['time'] = data['time'].apply(lambda x : x[0:4]+'-'+x[4:6] +'-'+ x[6:8]+ ' '+x[8:10]+ ':'+x[10:12]+ ':'+x[12:14])
data['time'] = pd.to_datetime(data['time'], format='%Y-%m-%d %H:%M:%S', errors='raise')

 

1.3. datetime.datetime(year, month, day, hour, minu, sec) 사용하기

: datetime & 함수 선언 & apply 함수를 사용하는 조합이다.

: lambda를 사용하는 것이 싫다면, 함수를 이용해서 apply에 넣어줄 수 도 있다.

 

- pd.datetime() 은 간단하기 때문에, 적은 데이터를 변환할때는 유용하다. 그러나, 많은 데이터로 돌릴때는 너무 느리다.

  그렇기 때문에, datetime 을 선언해서 사용하는 방법이 효과적이라고 생각한다. 

 

def tranform_datetype(x):
    x = str(x)
    year = int(x[:4])
    month = int(x[4:6])
    day = int(x[6:8])
    hour = int(x[8:10])
    minu = int(x[10:12])
    sec = int(x[12:])
    return datetime.datetime(year, month, day, hour, minu, sec)
import datetime
data = pd.read_csv('datatime_exa.csv')
data['time'] = data['time'].apply(tranform_datetype)

 

2. Datetime 중 에 특정한 년/월/일/시/분/초 만 반환하기 

데이터를 만지다보면, 보통 특정한 요일이나, 월 등을 알고 싶을 경우가 있다. 

그럴경우 역시, datetime 함수를 사용하면 편하게 이용할 수 있다. 

 

2.1. lambda 함수 이용

: 단순히, int -> str 로 변한다음에 슬라이싱을 해주는 방법이다.

: 이 방법에서도 역시 Series 형식을 변경하기 위해서 map 함수를 사용한다.

data['year'] = data['time'].map(lambda x : int(str(x)[:4]))
data['month'] =  data['time'].map(lambda x : int(str(x)[4:6]))
data['day'] =  data['time'].map(lambda x : int(str(x)[6:8]))
data['hour'] = data['time'].map(lambda x : int(str(x)[8:10]))
data['min'] = data['time'].map(lambda x : int(str(x)[10:12]))
data['sec'] = data['time'].map(lambda x : int(str(x)[12:14]))

 

2.2. datetime 함수 이용 

: datetime으로 변환 시킨 것을 .dt 로하면, 내가 원하는 부분만 가져올 수 있다.

data['date']       = data['time'].dt.date  
data['year']       = data['time'].dt.year         # 연(4자리숫자)
data['month']      = data['time'].dt.month        # 월(숫자)
data['month_name'] = data['time'].dt.month_name() # 월(문자)

data['day']        = data['time'].dt.day          # 일(숫자)
data['all_time']   = data['time'].dt.time         # HH:MM:SS(문자)
data['hour']       = data['time'].dt.hour         # 시(숫자)
data['minute']     = data['time'].dt.minute       # 분(숫자)
data['second']     = data['time'].dt.second       # 초(숫자)

 

data['quarter']       = data['time'].dt.quarter       # 분기(숫자)
data['day_name']      = data['time'].dt.day_name()       # 요일이름(문자) (=day_name())
data['weekday']       = data['time'].dt.weekday       # 요일숫자(0-월, 1-화) (=dayofweek)
data['weekofyear']    = data['time'].dt.weekofyear    # 연 기준 몇주째(숫자) (=week)
data['dayofyear']     = data['time'].dt.dayofyear     # 연 기준 몇일째(숫자)
data['days_in_month'] = data['time'].dt.days_in_month # 월 일수(숫자) (=daysinmonth)

 

3. 기타

- add datetime : 데이트 타임의 시간을 늘리거나 뺄 수 있다.

- timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

- 위의 시간을 조절해서 시간 등을 더하고 뺄 수있다. 

import datetime
data['time_add'] = data['time']
data['time_subtract'] = data['time']
data['time_add'] += datetime.timedelta(days = 1)
data['time_subtract'] -= datetime.timedelta(days = 1)