코딩이야기

하루하루 코딩이야기 3 : pd.to_datetime(), Datetime feature 다루기

구경영 2023. 11. 23. 14:23
728x90
반응형
SMALL

얼마 전에 데이콘에서 열렸던 현대 AI Challenge의 선박 대기시간 예측 데이터를 일부 활용하여 분석

 

ship data Loading

import pandas as pd
import datetime

# 선박 대기시간 예측 데이터 - 일부만 발췌
ship = pd.read_csv('ship.csv')
ship.ATA = pd.to_datetime(ship['ATA'])
ship.head()

<주제>
Datetime column인 ATA column을 datetime 형식으로 변환하고 여러 feature 생성하기

 

 

1. 연도 : year, 짝수 해, 윤년

ship['year'] = ship.ATA.dt.year # 연도 column 생성
ship['year_2'] = ship.year.apply(lambda x : 2 if x % 2 == 0 else 1) # 짝수 해인지 판정
ship['is_leap'] = ship.year.apply(lambda x: 1 if (x % 4 == 0 and x % 100 != 0) or (x % 400 == 0) else 0) # 윤년 여부 판정

 

 

2. 월 : month, 짝수 월, 계절, 분기, 반기

ship['month'] = pd.to_datetime(ship['datetime']).dt.month # 월 column 생성
ship['month_2'] = ship.month.apply(lambda x : 2 if x % 2 == 0 else 1) # 짝수 월인지 판정
ship['season'] = ship.month.apply(lambda x : 'spring'
                                  if x in [3,4,5] else "summer"
                                  if x in [6,7,8] else "fall"
                                  if x in [9,10,11] else "winter") # 계절 column 생성

ship['quarter'] = ship.month.apply(lambda x : 'first_quarter'
                                   if x in [1,2,3] else "second_quarter"
                                   if x in [6,7,8] else "third_quarter"
                                   if x in [9,10,11] else "fourth_quarter") # 분기 column 생성

ship['half'] = ship.month.apply(lambda x : 'first_half' if x in [1,2,3,4,5,6] else "second_half") # 상/하반기 column 생성

 

 

3. 일 : day, 짝수 일, 월말, 월초

ship['day'] = pd.to_datetime(ship['ATA']).dt.day # 일 column 생성
ship['day_2'] = ship.day.apply(lambda x : 2 if x % 2 == 0 else 1) # 짝수 일인지 판정
ship['day_early'] = ship.day.apply(lambda x : 1 if x < 5 else 0) # 월초인지 판정
ship['day_late'] = ship.day.apply(lambda x : 1 if x > 26 else 0) # 월말인지 판정

 

 

 

4. 시간 : hour, 짝수 시간, 시간대(time zone)

ship['hour'] = pd.to_datetime(ship['ATA']).dt.hour # 시간 column 생성
ship['hour_2'] = ship.hour.apply(lambda x : 2 if x % 2 == 0 else 1) # 짝수 시간인지 판정
ship['time_zone'] = ship.hour.apply(lambda x : 'morning' 
                                    if x in [6,7,8,9] else "lunch" 
                                    if x in [10,11,12,13,14] else "dinner" 
                                    if x in [15,16,17,18,19,20] else "night") # 시간대 column 생성

 

 

5. 분,  : minute, 짝수 분, 정각이나 30분 근처, second, 짝수 초

ship['minute'] = pd.to_datetime(ship['ATA']).dt.minute # 분 column 생성
ship['minute_2'] = ship.minute.apply(lambda x : 2 if x % 2 == 0 else 1) # 짝수 분인지 판정
ship['exact_or_close30'] = ship['minute'].apply(lambda x: 1 if x % 30 == 0 or x == 0 else 0) # 정각 / 30분인지 판정
ship['second'] = pd.to_datetime(ship['ATA']).dt.second # 초 column 생성
ship['second_2'] = ship.second.apply(lambda x : 2 if x % 2 == 0 else 1) # 짝수 초인지 판정

 

 

6. 요일 : weekday, 주말 여부

ship['weekday'] = pd.to_datetime(ship['ATA']).dt.weekday # 요일을 숫자로 생성
ship['weekend'] = ship.weekday.apply(lambda x : '주말' if x in [5,6] else "평일") # 주말여부 column 생성

 

 

7. 추가 : date, day_of_year(1~365) / week_of_year(1~52)

ship['date'] = pd.to_datetime(ship['ATA']).dt.date.apply(lambda x :
                str(x).split('-')[1] + str(x).split('-')[2]).astype('int64') # date column 생성
ship['day_of_year'] = pd.to_datetime(ship['ATA']).dt.day_of_year # day_of_year column 생성
ship['week_of_year'] = pd.to_datetime(ship['ATA']).dt.isocalendar().week # week_of_year column 생성

date : 1월 7일 > 107 / 10월 7일 > 1007

day_of_year : 날짜를 365일에 맞춰서 mapping

week_of_year : 날짜를 52주에 맞춰서 mapping

728x90
반응형
LIST