날짜와 시간 데이터를 다루는 법에 대해 학습했다.
우선 사용할 데이터를 가져온다.
import pandas as pd
order_df = pd.read_csv('data/order.csv')

order_time과 shipping_time 컬럼에 날짜와 시간 값이 들어 있는데, 두 컬럼 모두 날짜가 연도-월-일 형태로 되어 있다. pandas datetime의 기본 형식인데, 아래와 같이 read_csv()의 parse_dates 파라미터에 두 컬럼의 값을 넘겨주면, pandas는 문제 없이 두 컬럼의 타입을 datetime으로 불러올 수 있다.
order_df = pd.read_csv('data/order.csv', parse_dates=['order_time', 'shipping_time'])
처리 전 데이터 타입

처리 후 데이터 타입


_=> 이런 형식의 데이터를 불러올 때에는 dayfirst라는 파라미터를 True로 설정하면 된다.
일자 값이 앞에 온다는 것을 의미하며, 원래 기본값은 False로 되어 있어서, 따로 설정해 주지 않으면 월/일/연도 순서로 값을 인식한다.
따로 이 파라미터를 설정하지 않아도 20/01/2015 이런 식으로 가장 앞에 있는 값이 월이 아니라 일이라는 것이 명확하면 pandas가 알아서 일/월/연도 형식으로 판단하여 데이터를 불러오기는 하지만, 10/01/2015처럼 월/일/연도인지, 일/월/연도인지 명확하지 않은 경우도 많기 때문에 따로 파라미터 값을 명확하게 설정해 주는 것이 좋다!_

=> 지금은 날짜 값이 연도/월/일 형식으로 되어 있는데, 연도 값이 4자리가 아니라 2자리로 되어 있다. 여기서 추가로 설정을 해 주지 않으면 pandas가 자동으로 월/일/연도 순서로 날짜 값을 인식할 수도 있기 때문에, 이런 경우에는 아래 코드와 같이 to_datetime()에서 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)
order_df.head()


=> 이런 경우에 그냥 바로 to_datetime() 함수를 쓰면, pandas가 날짜와 시간 값을 제대로 인식하지 못해서 오류가 날 수있다.
데이터 형식에 맞게 날짜와 시간을 표현하는 문자열을 만들어서 format이라는 파라미터에 넘겨줘야 하고, 이 파라미터에 날짜와 시간을 표현할 수 있는 코드를 사용해서 만든 문자열을 넘겨줘야 한다.
아래 코드를 보면 '%Y년 %m월 %d일 %H시 %M분 %S초'이라는 값을 넘겨주었고, 여기서 %Y, %m, %d 같은 건 시간과 관련된 정보가 들어갈 위치를 코드로 표현한 것이다. %Y는 연도(4자리), %m은 월(2자리), %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초')
order_df.head()
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()
=> strftime() 함수는 날짜와 시간을 원하는 형식으로 표현하는 역할을 하는데요. 여기서 주의할 점은 datetime과 strftime() 사이에 dt를 써서 이 함수가 날짜와 시간 정보에 접근할 수 있도록 해 줘야 한다. 그리고 문자열로 원하는 형식을 넣으면 되고, 이때 날짜와 시간과 관련된 코드 값을 활용하면 된다.
tz_localize()이라는 함수를 사용해서 원하는 시간대를 설정하면 된다.
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]
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]
시간대가 설정되어있는 데이터에만 사용 가능, tz_localize()는 시간대가 설정되어있지 않은 데이터에만 사용 가능