티스토리 뷰

pandas

pd.to_datetime, strptime, strftime,

데이터조이 2022. 7. 15. 15:04

Python에서 날짜, 시간 데이터 다루기

설명을 위한 Data Frame 생성

import pandas as pd
time_df = pd.DataFrame({
    '주문번호': ['1', '2', '3', '4', '5'],
    '주문일자': ['2022-07-11', '2022-07-11', '2022-07-11', '2022-07-11', '2022-07-11'],
    '주문시간': ['9:00', '9:30', '10:00', '10:30', '11:00'],
    '입금확인일시': ['2022-07-11 09:10', '2022-07-11 09:40', '2022-07-11 10:10', '2022-07-11 10:40', '2022-07-11 11:10'],
    '출고완료일시': ['2022-07-12 09:00', '2022-07-12 09:30', '2022-07-13 10:00', '2022-07-13 10:30', '2022-07-13 11:00']})

  • 주문 -> 입금 -> 출고 순으로 이뤄지는 프로세스가 있다고 가정합니다. 

새로운 변수 생성

  • '주문일자(년-월-일)'와 '주문시간(시:분)' 컬럼을 합쳐 '주문일시'라는 새로운 컬럼을 만들겠습니다.
# time_df['주문시간'] = time_df['주문시간'].astype('str').str.zfill(5)  # 9:30 -> 09:30
time_df['주문일시'] = time_df[['주문일자', '주문시간']].astype(str).apply(' '.join, axis=1)

  • 제일 오른쪽에 주문일시 컬럼이 만들어진 것을 확인할 수 있습니다.
  • 현재 모든 컬럼의 dtypes는 전부 object입니다. 

string <-> datetime

Data Frame에서 문자열 -> datetime 형태로 바꾸기

pd.to_datetime

  • 위에서 만든 '주문일시'컬럼의 형태를 문자열에서 datetime 형태로 바꾸겠습니다. 
time_df['주문일시'] = pd.to_datetime(time_df['주문일시'])  # 방법1. int, string 모두 사용 가능.
# time_df['주문일시'] = time_df['주문일시'].astype('datetime64[ns]')  # 방법2. string만 사용 가능.

  • pd.to_datetime을 사용해 주문일시 컬럼의 dtypes을 datetime64[ns]로 바꾸었습니다. 

Data Frame에서 날짜 차이 계산

  • 입금에서 출고까지 얼마나 걸리는지 확인을 해보겠습니다.
  • 먼저 입금확인일시, 출고완료일시 컬럼을 datetime 형태로 변경합니다. 
time_df[['입금확인일시','출고완료일시']] = time_df[['입금확인일시','출고완료일시']].apply(pd.to_datetime)  # format='%Y-%m-%d %H:%M:%S.%f'

  • 그 후 출고완료일시에서 입금확인일시를 빼 입금에서 출고까지 걸리는 시간을 계산합니다. 
time_df['입금확인-출고완료'] = time_df['출고완료일시'] - time_df['입금확인일시']

  • 위에서 구한 정확한 소요 시간이 아닌 '며칠'이 걸렸는지 일 수 정보도 필요해 아래와 같이 구해보았습니다. 

dt.date, dt.days (Number of days 계산)

time_df['출고LT_new'] = (pd.to_datetime(time_df['출고완료일시'].dt.date) - pd.to_datetime(time_df['입금확인일시'].dt.date)).dt.days

 

  • <구동 순서 살펴보기>
  • 먼저 dt.date를 통해 년, 월, 일 정보만 추출합니다. (dt.strftime('%Y-%m-%d')도 가능.)

  • pd.to_datetime을 통해 다시 datetime형태로 바꿔주고 두 컬럼의 차이를 구합니다. 

  • dt.days를 통해 일 수(Number of days)를 구합니다. 

  • 출고LT_new라는 새로운 변수를 생성해 입금에서 출금까지 며칠이 걸리는지 계산하였습니다. 

 

번외

datetime 패키지를 이용해 문자열 -> datetime 형태로 바꾸기

datetime 패키지를 이용해 문자열을 datetime 형태로 바꿀 땐 strptime (string parse datetime)을 사용. 

  • 년, 월, 일, 시, 분, 초: datetime.datetime.strptime('2022-07-11 22:07:11', "%Y-%m-%d %H:%M:%S")

  • 년, 월, 일, 시, 분: datetime.datetime.strptime('2022-07-11', "%Y-%m-%d")

  • 년, 월, 일: datetime.datetime.strptime('2022-07-11', "%Y-%m-%d").date()

  • 시, 분, 초: datetime.datetime.strptime('22:07:11', "%H:%M:%S").time()

  • 여러개의 문자열을 datetime 형태로 변환
import datetime
holidays_list = ['2022-05-05', '2022-05-08', '2022-06-01', '2022-06-06']
holidays_list_date = list()
for holiday in holidays_list:
    holidays_list_date.append(datetime.datetime.strptime(holiday, "%Y-%m-%d").date())

datetime -> 문자열 형태로 바꾸기

datetime을 문자열로 바꾸고 싶을 땐 strftime(%Y-%m-%d) 사용

df['column'].strftime('%Y-%m-%d')
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함