일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- sql
- torch
- 그룹바이
- CASE
- nlp논문
- sigmoid
- 자연어 논문 리뷰
- 서브쿼리
- 자연어처리
- 짝수
- MySQL
- GRU
- update
- inner join
- airflow
- SQL코테
- 카이제곱분포
- Statistics
- LSTM
- t분포
- NLP
- SQL 날짜 데이터
- HackerRank
- 표준편차
- Window Function
- 자연어 논문
- 설명의무
- 코딩테스트
- leetcode
- 논문리뷰
- Today
- Total
HAZEL
1. Pandas - Datetime() 한번에 정리하기 본문
시계열 데이터를 만지다 보면, 자연스럽게 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)
'DATA ANALYSIS > Python with Data' 카테고리의 다른 글
Pandas - 데이터 분석할 때 유용한 Groupby (0) | 2022.10.06 |
---|---|
[ Pandas ] 데이터프레임 데이터의 '{}' 안에 있는 값 추출하기 (0) | 2022.05.09 |