파이썬/판다스

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