# 코드잇 데이터 사이언티스트 강의 듣는 중
<날짜와 시간 데이터 타입 설정하기>
--> 데이터 프레임에 날짜와 시간이 들어가 있을 때,
데이터 타입을 확인해 보면 대체로 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
<시간대 설정하기>
- 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
'Data Science > Pandas' 카테고리의 다른 글
[데이터 전처리] 데이터 합치기) 같은 형식 concat() / 칼럼 기준 merge() / 인덱스 기준 join() (0) | 2024.06.25 |
---|---|
[데이터 전처리] 날짜와 시간 데이터 인덱싱하기/ 더하기 빼기, 불린 인덱싱 (0) | 2024.06.24 |
[데이터 전처리] 데이터 구간화 cut() or apply(), 람다함수와 apply() (0) | 2024.06.21 |
[데이터 전처리] 새로운 값 계산하기, 정규화, 표준화, 과학적 표기법 (0) | 2024.06.20 |
[데이터 전처리] 대소문자 처리하기, 문자열 분리하기, 문자 제거하기 (0) | 2024.06.17 |