파이썬/판다스

pandas 배우기 7편 시간, 날짜, datetime, to_datetime, dt, to_period,strftime, strptime, timedelta, resample

Olivia-BlackCherry 2025. 3. 22. 17:47

1. datetime

1) pd.to_datetime()

pd.to_datetime( 날짜 )  문자열, 숫자, 리스트 등의 데이터를 날짜(datetime) 형식으로 변환하는 함수이다. 

자동으로 날짜 형식을 인식해서 변환해주며, 시간이 없으면 00:00:00으로 추가된다.

pd.to_datetime("2025-03-22")

2025-03-22 00:00:00 

pd.to_datetime(df['Yr_Mo_Dy'])


 겉으로 보기에는 같을지 몰라도, dtype을 보면 datetime으로 바뀐 것을 알 수 있다.

 

 

2) dt

dataframe.  dt .형식 : datetime 형식의 데이터를 쉽게 조작할 수 있도록 도와주는 pandas의 기능이다. 대표적으로 아래와 같은 속성을 추출한다.

year, month, day, hour, minute, second 

df['Yr_Mo_Dy'] = pd.to_datetime(df['Yr_Mo_Dy'])
n_year = df['Yr_Mo_Dy'].dt.year
n_month = df['Yr_Mo_Dy'].dt.month
n_day = df['Yr_Mo_Dy'].dt.day

 

dt 접근자를 이용해 아래의 속성도 추출할 수 있다.

weekday 요일(0~6)  ---> 0:월, 1:화, 2:수, 3:목, 4:금, 5:토, 6:일

day_name() 요일 이름 

month_name() 월 이름 

is_month_start 월의 첫날 여부

is_month_end 월의 마지막 날 여부

is_leap_year 윤년 여부

 

위 내용을 바탕으로 새로운 datetime을 만들 수도 있다. 

pd.to_datetime({"year": , "month":, "day":})

--> dictionary 형태를 넣어서 키:속성으로 다시 datetime을 만든다.

df['Yr_Mo_Dy'] = pd.to_datetime({"year": n_year, "month":n_month, "day":n_day})

 

 

3) to_period()

pd. to_period  :  날짜를 특정 주기(period) 단위로 변환하는 기능을 하며 계산이 가능하다. 

pandas의 datetime 형식의 컬럼은 series 형태로 저장이 되는데, to_period()는 개별 날짜 값에 적용되는 메서드이기 때문에 series전체에 적용하려면 접근자 dt.를 써야 한다.

yearly : 'Y'

Quarter : 'Q'

montly : 'M'

weekly : 'W'  --> 시작요일 지정 방법 ('W-SUN')

daily : 'D'

 

df.groupby(df['Yr_Mo_Dy'].dt.to_period('M')).mean()

 

 

df['date'].dt.to_period('W-SUN')

 

 

 

4) strftime()

str f time : string format time 이라는 의미처럼 datetime 값을 문자열로 변환하는 함수

연 Y / y

월(숫자) m

월(문자) B / b

일 d

요일 A / a

시간 H(24시간) / h(12시간)

AM/PM p

분 M

초 s

 

df['Yr_Mo_Dy'].dt.strftime("%Y")

df['Yr_Mo_Dy'].dt.strftime('%Y/%m/%d/%a')​

 

to_period() vs strftime()

날짜를 기간 단위로 변환하여 연산도 하려면 to_period()를, 그냥 문자열로 변환하여 출력하려면 strftime()을 쓰면 된다.

 

 

 

5) strptime()

str p time :  string parse time문자열을 datetime객체로 변환하는 함수

주어진 형식으로 변환하나, 앞선 문자열과 동일한 형태(format)을 취해야 한다.

ex) /// --> /// 구분자 동일

import datetime
datetime.datetime.strptime(문자열, format)

 

 

 

6) timedelta

datetime 연산을 하려면 timedelta를 써야 한다. 그러면 자동으로 윤달도 계산하여 날짜를 정확하게 연산해준다.

datetime 기준 시간  +/- timedelta(format) 

days = ? 날짜

weeks = ? 주*7일

hours = ? 시간

minutes = ?  분

seconds =? 초

milliseconds = ? 1/1000 초

 

 

< 하루 전 >

datetime - timedelta

import datetime
datetime_df  = str_df.apply(lambda x : datetime.datetime.strptime(x, "%Y/%m/%d/%a"))
datetime_df - datetime.timedelta(days=1)

 

 

< 일주일 전 >

datetime - timedelta

one_week_before = datetime_df - datetime.timedelta(weeks=1)
one_week_before

 

 

<  날짜 차이 : days >

datetime - datetime 날짜 차이

datetime_df  = str_df.apply(lambda x : datetime.datetime.strptime(x, "%Y/%m/%d/%a"))
one_day_before = datetime_df - datetime.timedelta(days=1)
diff = datetime_df - one_day_before
diff

 

diff.apply(lambda x: x.days)

 

 

 

< 1시간 30분 후 >

datetime + timedelta 시간 더하기

time_after_df = datetime_df + datetime.timedelta(hours = 1, minutes=30)
time_after_df

 

< 24시간 이내 차이 : seconds >

datetime - datetime 시간 차이

datetime_df  = str_df.apply(lambda x : datetime.datetime.strptime(x, "%Y/%m/%d/%a"))
time_after_df = datetime_df + datetime.timedelta(hours = 1, minutes=30)
diff = time_after_df - datetime_df
diff

시간 차이 계산 seconds

- 초 기준

diff.apply(lambda x:x.seconds)

- 분 기준

diff.apply(lambda x:x.seconds/60)

 

 

< 전체 시간 차이 : seconds >

total seconds는 seconds와 다르다. seconds는 날짜는 무시하고 24시간 이내의 시간 단위만 반환하는 것에 비해 total_seconds()는 전체 날짜 개념을 초단위로 반환한다.

time_after_df = datetime_df + datetime.timedelta(days = 3, hours = 1, minutes=30)
time_after_df

diff = time_after_df - datetime_df
diff

diff.apply(lambda x:x.seconds)

 

diff.apply(lambda x:x.total_seconds())

 

 

7) resample()

판다스에서 시간 단위를 변경할 때 사용하는 함수이며, 주로 시간 데이터를 그룹화하여 집계할 때 사용한다. 

단, 조건은 index가 날짜(datetime)이어야 한다.

df.resample(rule).agg(func)

(rule) --> 새로운 시간 간격 

D : 일별

W : 주별

M : 월별

(func)

sum, mean, count

 

위의 데이터에서 우선 인덱스를 datetime으로 하고, select_dtypes(include=?)로 number형 데이터만 추출한 뒤, resample해준다.

df_num.resample('W').agg(['min', 'max', 'std', 'min'])

 

datetime, to_datetime, dt, to_period,strftime, strptime, timedelta