[Pandas] 날짜와 시간 데이터 다루기

정만·2025년 4월 3일

데이터분석

목록 보기
47/61

날짜와 시간 데이터를 다루는 법에 대해 학습했다.

우선 사용할 데이터를 가져온다.

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처럼 월/일/연도인지, 일/월/연도인지 명확하지 않은 경우도 많기 때문에 따로 파라미터 값을 명확하게 설정해 주는 것이 좋다!_

연도(2자리)/월/일 형식의 데이터

=> 지금은 날짜 값이 연도/월/일 형식으로 되어 있는데, 연도 값이 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()

datetime을 원하는 형태로 바꿔서 표현하기

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]
  • 이미 설정해둔 시간대를 다른 시간대로 바꾸고싶을 경우
    => 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]

시간대가 설정되어있는 데이터에만 사용 가능, tz_localize()는 시간대가 설정되어있지 않은 데이터에만 사용 가능

profile
멋있는 어른이 되고싶은 정만이의 벨로그

0개의 댓글