티스토리 뷰
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')
'pandas' 카테고리의 다른 글
split과 join을 이용해 문자열 자른 뒤 합치기(apply, lambda, axis) (0) | 2022.11.26 |
---|---|
영업일(bdate_range, is_busday, weekmask) (0) | 2022.07.15 |
group by 후 custom된 집계함수 사용 (0) | 2022.06.16 |
차집합, 교집합, drop_duplicates, duplicated, indicator (0) | 2022.03.07 |
drop id max, datetime, 요일, one-hot encoding, lag, mms (0) | 2022.03.06 |
댓글
- Total
- Today
- Yesterday
공지사항
최근에 올라온 글
글 보관함