자신에게 친절할 것 :)

Data Science/Pandas

[데이터 전처리] 날짜와 시간 데이터 타입 설정하기, datetime

Tashapark 2024. 6. 24. 18:19
728x90
반응형

# 코드잇 데이터 사이언티스트 강의 듣는 중


<날짜와 시간 데이터 타입 설정하기>

 

--> 데이터 프레임에 날짜와 시간이 들어가 있을 때, 

데이터 타입을 확인해 보면 대체로 object임. 

 

--> 그런데 이러면 원하는 대로 시간과 날짜를 인덱싱하기가 불편함. 

 

 

order_df.dtypes

 

 

 

 

 

- pd.to_datetime()

- 판다스에 메소드로 지정하고 해당하는 벡터를 ()안에 넣으면 됨. 

pd.to_datetime(order_df['order_time'])

 

--> dtypes가 datetime으로 바뀜. 

 

 

 

 

 

 

- but, 1개 값만 불러오면 타입이 달라짐. 

pd.to_datetime(order_df['order_time'])[0]

 

--> timestamp가 나타남. 

 

- datetime, timestamp 모두 어떤 시점에 날짜와 시간을 표현하는 데이터 타입.

cf) timestamp --> 시리즈를 구성하는 값 하나하나가 타임스탬프 --> 즉 1개

datetime --> 타임스탬프 별로 이루어진 시리즈의 타입이 데이트타입  --> 총 시리즈

 

- 시간에 해당하는 벡터들을 바꿔줌

order_df['order_time'] = pd.to_datetime(order_df['order_time'])
order_df['shipping_time'] = pd.to_datetime(order_df['shipping_time'])

 

--> Nan에서 NaT로 not a time 날짜와 시간 데이터의 결측값을 나타내는 것으로 바뀜. 

 

 

 

 

 

 

- 전체 데이터를 확인해보면,

order_df.dtypes

 

--> 변경된 것 확인 가능

--> ns: nano second ; 1/10초 단위로 표현 가능한 데이터 타입을 의미. 정교하게 표현 가능함. 

 

 


<날짜와 시간 데이터 불러올 때 형식 지정하기>

 

- 따로 데이터를 부른 후에 수정하는 것이 아니라,

데이터를 불러오면서부터 데이터 타입의 지정도 가능함. 

- parse_dates = []를 파라미터로 넣어주면 됨. 

order_df = pd.read_csv('data/order.csv', parse_dates =['order_time', 'shipping_time'])

 

--> 그러면 처음부터 데이터 타입이 datetime으로 변경되어서 출력됨.

 

- 결측치를 확인했기 때문에 총 개수를 확인필요

order_df.isna().sum()

 

--> 1개 밖에 없으니깐, 지워도 괜찮을 듯 싶어서 지움. 

order_df = order_df.dropna()

 

 

 

 

--> 데이터를 불러올 때부터 지정을 헤주면 판다스가 대체로 알아서 맞춰서 처리 해줌

예1: 연도-월-일을 연도/월/일로 /로 구분된 데이터를 불러오면서 알아서 -로 바꿔줌

order_df = pd.read_csv('data/order1.csv', parse_dates=['order_time', 'shipping_time'])
order_df.head()

 

--> 그냥 파일을 읽으면 /로 나타남

 

 

 

 

--> 구분자가 - 로 바뀜

 

 

 

 

 

-  월/일/연도 형식의 데이터도 알아서 연-월-일로 바꿔 줌. 

- 주로 미국에서 사용하는 형식인데 그냥 우리한테 맞게 바꿔줌.

 

 

 

 

 

 

--> 구분자가 - 로 바뀌고, 순서도 바뀜.

 

 

 

 

 

-  일/월/연도 형식의 데이터도 알아서 연-월-일로 바꿔 줌. 

 

- 주로 유럽에서 사용하는 형식으로 이런 형식의 디폴트 값은 월/일/연도이기 때문에,

일/월/연도로 불러오고 싶으면 dayfirst = True를 파라미터에 넣어줘야 함. 

- pandas가 알아서 판단하긴 하지만, 일과 월을 헷갈릴 수도 있기때문에 왠만하면 지정해줄 것. 

 

order_df = pd.read_csv('data/order3.csv', parse_dates=['order_time', 'shipping_time'], dayfirst=True)
order_df.head()

 

 

 

 

 


<날짜와 시간 데이터 타입 변경 시  형식 지정하기>

- read.csv()에 없는 기능을 사용해서 다양한 형태의 데이터의 형식을 지정 가능. 

- 일단 불러오고 그 이후에 변경함!

 

 

-  연도(2자리)/월/일 형식의 데이터도 알아서 연-월-일로 바꿔 줌. 

- 다만, 연도가 2자리라서 월로 인식할 수도 있기 때문에, yearfirst = True를 파라미터에 넣어줘야 함. 

 

order_df['order_time'] = pd.to_datetime(order_df['order_time'], yearfirst=True)
order_df['shipping_time'] = pd.to_datetime(order_df['shipping_time'], yearfirst=True)

 

- dayfirst와 yearfirst 2개가 모두 True일 때는 year에 더 우선순위를 둠. 

 

 

-  한글로 되어 있는 경우에는 각각의 값이 의미하는 것을 format=''에 넣어야 함 

 

- 이 경우에는 뭐가 무엇을 의미하는 지 몰라서 에러가 뜰 수 있음. 

- format='%Y년 %m월 %d일 %H시 %M분 %S초'

- 이 경우에는 이렇게 각각이 의미하는 바를 넣어줘야 함.

- %Y는 4자리 연도, %m와 %d는 2자리 월과 일임.

- %H는 24시간 기준 시간이고, 나머진 그냥 %M분 %S초임

--> 대소문자 주의 할 것. 

order_df['order_time'] = pd.to_datetime(order_df['order_time'],
                                        format='%Y년 %m월 %d일 %H시 %M분 %S초')
order_df['shipping_time'] = pd.to_datetime(order_df['shipping_time'],                                       
                                        format='%Y년 %m월 %d일 %H시 %M분 %S초')

<datetime을 원하는 형태로 바꾸기>

- 걍 원하는 위치에 맞게 커스텀을 해주면 됨.

 

-  일%d 영어로 월%B 연도%Y, 12 시간 기준%I:%M 분, %p오전/오후 로

- dt.strftime()에 각각의 지정값들을 넣어줘야함. 

- 이 경우에는 format이 필요 없음. 

 

 

order_df['order_time'] = order_df['order_time'].dt.strftime('%d %b %Y, %I:%M %p')
order_df['shipping_time'] = order_df['shipping_time'].dt.strftime('%d %b %Y, %I:%M %p')

order_df.head()

 

+ 필요하면 참고해서 바꾸면 됨. 

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

 

datetime — Basic date and time types

Source code: Lib/datetime.py The datetime module supplies classes for manipulating dates and times. While date and time arithmetic is supported, the focus of the implementation is on efficient attr...

docs.python.org


<시간대 설정하기>

-  dt.tz_localize()

- 위 함수에 파라미터로 지역을 넣어주면 됨. 

-.dt를 무조건 넣어줘야 하니깐, 그냥 하나로 외우면 될 듯 

- 시간대가 설정되어 있지 않은 상태여야만 가능함. 

- 시간대가 이미 설정되어 있으면 에러 뜸. 

order_df['order_time'].dt.tz_localize('Asia/Seoul')


#시간대가 추가되어서 출력됨
0    2015-01-20 21:52:00+09:00
1    2015-02-07 22:53:00+09:00
2    2015-02-08 13:15:00+09:00
3    2015-02-24 03:25:00+09:00
4    2015-03-09 03:56:00+09:00
                ...           
95   2017-09-13 21:23:00+09:00
96   2017-10-11 14:20:00+09:00
97   2017-10-19 15:23:00+09:00
98   2018-01-01 04:04:00+09:00
99   2018-01-18 15:47:00+09:00
Name: order_time, Length: 100, dtype: datetime64[ns, Asia/Seoul]

 

- +09:00 --> UTC coordinated universal time, 국제 표준시로 표현한 서울의 시간대임. 

- 영국의 그리니치 천문대보다 9시간 더 빠르다는 것을 의미함. 

 

 

- 설정한 시간대 변경하기 --> dt.tz_convert()

-  무조건 이미 시간대가 설정이 되어 있는 경우에만 사용 가능함. 

- 시간대가 없으면 에러 뜸. 

order_df['order_time'].dt.tz_convert('America/New_York')

# 뉴욕 시간대로 변경됨
0    2015-01-20 07:52:00-05:00
1    2015-02-07 08:53:00-05:00
2    2015-02-07 23:15:00-05:00
3    2015-02-23 13:25:00-05:00
4    2015-03-08 14:56:00-04:00
                ...           
95   2017-09-13 08:23:00-04:00
96   2017-10-11 01:20:00-04:00
97   2017-10-19 02:23:00-04:00
98   2017-12-31 14:04:00-05:00
99   2018-01-18 01:47:00-05:00
Name: order_time, Length: 100, dtype: datetime64[ns, America/New_York]

 

- 시간대 확인 가능함

 import pytz

for tz in pytz.all_timezones:
    print(tz)

- .dt.date

- .dt 뒤의  속성에 따라서  원하는 값만 출력되게 할 수 있음. 

- date, year, month, day, dayofweek 등등

- 판다스에는 날짜와 시간을 볼 수 있는 게 많음. 

# 시간 없이 날짜만
order_df['order_time'].dt.date


# 연도만
order_df['order_time'].dt.year

# 달만
order_df['order_time'].dt.month

# 일만
order_df['order_time'].dt.day

#당연히 시, 분, 초도 가능함

# 요일 --> 0: 월, 6: 일
order_df['order_time'].dt.dayofweek

 

728x90
반응형