ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 12-1 datetime 오브젝트
    Do it! 판다스 입문 2022. 6. 26. 17:01

    datetime 라이브러리는 날짜와 시간을 처리하는 등의 다양한 기능을 제공하는 파이썬 라이브러리입니다. datetime 라이브러리에는 날짜를 처리하는 date 오브젝트, 시간을 처리하는 time 오브젝트, 날짜와 시간을 모두 처리하는 datetime 오브젝트가 포함되어 있습니다. 앞으로 3개의 오브젝트를 명확히 구분하기 위해 영문을 그대로 살려 date, time, datetime 오브젝트라고 부르겠습니다.

     

     

    datetime 오브젝트 사용하기

    1. datetime 오브젝트를 사용하기 위해 datetime 라이브러리를 불러옵니다.

    from datetime import datetime

     

    2. now, today 메서드를 사용하면 다음과 같이 현재 시간을 출력할 수 있습니다.

    now1 = datetime.now( )
    print(now1)

    2018-05-18 13:18:39.322084

    now2 = datetime.today( )
    print(now2)

    2018-05-18 13:18:40.957598

     

    3. 다음은 datetime 오브젝트를 생성할 때 시간을 직접 입력하여 인자로 전달한 것입니다. 각 변수를 출력하여 확인해 보면 입력한 시간을 바탕으로 datetime 오브젝트가 생성된 것을 알 수 있습니다.

    t1 = datetime.now( )
    t2 = datetime(1970, 1, 1)
    t3 = datetime(1970, 12, 12, 13, 24, 34)

    print(t1)
    print(t2)
    print(t3)

    2018-05-15 13:23:06.389968
    1970-01-01 00:00:00
    1970-12-12 13:24:34

     

    4. datetime 오브젝트를 사용하는 이유 중 하나는 시간 계산을 할 수 있다는 점입니다. 다음은 두 datetime 오브젝트의 차이를 구한 것입니다.

    diff1 = t1 - t2

    print(diff1)
    print(type(diff1))

    17669 days, 13:27:39.736037
    <class 'datetime.timedelta'>

    diff2 = t2 - t1
    print(diff2)
    print(type(diff2))

    -17670 days, 10:32:20.263963
    <class 'datetime.timedlta'>

     

     

     

     

     

    datetime 오브젝트로 변환하기 - to_datetime 메서드

    경우에 따라서는 시계열 데이터를 문자열로 저장해야 할 때도 있습니다. 하지만 문자열은 시간 계산을 할 수 없기 때문에 datetime 오브젝트로 변환해 주어야 합니다. 이번에는 to_datetime 메서드를 사용하여 문자열을 datetime 오브젝트로 변환하는 방법에 대해 알아보겠습니다.

     

     

    문자열을 datetime 오브젝트로 변환하기

    1. 먼저 ebola 데이터 집합을 불러옵니다.

    import pandas as pd
    import os

    ebola = pd.read_csv('../data/country_timeseries.csv')

     

    2. ebola 데이터프레임을 보면 문자열로 저장된 Date 열이 있는 것을 알 수 있습니다.

    print(ebola.info( ))

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 122 entries, 0 to 121
    Data columns (total 18 columns):
    Date                         122 non-null object
    ...
    Deaths_Spain             16 non-null float64
    Deaths_Mali                12 non-null float64
    dtypes: float64(16), int64(1), object(1)
    memory usage: 17.2+ KB
    None

     

    3. to_datetime 메서드를 사용하면 Date 열의 자료형을 datetime 오브젝트로 변환할 수 있습니다. 다음과 같이 to_datetime 메서드를 사용하여 Date 열의 자료형을 datetime 오브젝트로 변환한 다음 ebola 데이터프레임에 새로운 열로 추가합니다.

    ebola['date_dt'] = pd.to_datetime(ebola['Date'])
    print(ebola.info( ))

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 122 entries, 0 to 121
    Data columns (total 19 columns):
    Date                         122 non-null object
    Day                          122 non-null object
    ...
    date_dt                    122 non-null datetime64[ns]
    dtypes: datetime64[ns](1), float64(16), int64(1), object(1)
    memory usage: 18.2+ KB
    None

     

    4. to_datetime 메서드를 좀 더 자세히 알아볼까요? 시간 형식 지정자(%d, %m, %y)와 기호(/, -)를 적절히 조합하여 format 인자에 전달하면 그 형식에 맞게 정리된 datetime 오브젝트를 얻을 수 있습니다. 다음 실습을 참고하여 format 인자의 사용법을 꼭 익혀두세요.

    test_df1 = pd.DataFrame({'order_day':['01/01/15', '02/01/15', '03/01/15']})

    test_df1['date_dt1'] = pd.to_datetime(test_df1['order_day'], format='%d/%m/%y')
    test_df1['date_dt2'] = pd.to_datetime(test_df1['order_day'], format='%m/%d/%y')
    test_df1['date_dt3'] = pd.to_datetime(test_df1['order_day'], format='%y/%m/%d')

    print(test_df1)

        order_day       date_dt1        date_dt2       date_dt3
    0    01/01/15   2015-01-01   2015-01-01   2001-01-15
    1    02/01/15   2015-01-02   2015-02-01   2002-01-15
    2    03/01/15   2015-01-03   2015-03-01   2003-01-15

    test_df2 = pd.DataFrame({'order_day':['01-01-15', '02-01-15', '03-01-15']})
    test_df2['date_dt'] = pd.to_datetime(test_df2['order_day'], format='%d-%m-%y')

    print(test_df2)

        order_day         date_dt
    0    01-01-15   2015-01-01
    1    02-01-15   2015-01-02
    2    03-01-15   2015-01-03

     

     

     

     

     

    시간 형식 지정자

    다음은 시간 형식 지정자를 정리한 표입니다. 이 장의 실습에서 종종 사용하므로 한 번 읽고 넘어가기 바랍니다.

     

     

    시간 형식 지정자

    시간 형식 지정자 의미 결과
    %a 요일 출력 Sun, Mon, ... Sat
    %A 요일 출력(긴 이름) Sunday, Monday, ..., Saturday
    %w 요일 출력(숫자, 0부터 일요일) 0, 1, ..., 6
    %d 날짜 출력(2자리로 표시) 01, 02, ..., 31
    %b 월 출력 Jan, Feb, ..., Dec
    %B 퉐 출력(긴 이름) January, Febuary, ..., December
    %m 월 출력(숫자) 01, 02, ..., 12
    %y 년 출력(2자리로 표시) 00, 01, ..., 99
    %Y 년 출력(4자리로 표시) 0001, 0002, ..., 2013, 2014, ..., 9999
    %H 시간 출력(24시간) 00, 01, ..., 23
    %l 시간 출력(12시간) 01, 02, ..., 12
    %p AM 또는 PM 출력 AM, PM
    %M 분 출력(2자리로 표시) 00, 01, ..., 59
    %S 초 출력(2자리로 출력) 00, 01, ..., 59
    %f 마이크로초 출력 000000, 000001, ..., 999999
    %z UTC 차이 출력(+HHMM이나 -HHMM 형태) (None), +0000, -0400, +1030
    %Z 기준 지역 이름 출력 (None), UTC, EST, CST
    %j 올해의 지난 일 수 출력(1일, 2일, ...) 001, 002, ..., 366
    %U 올해의 지난 주 수 출력(1주, 2주, ...) 00, 01, ..., 53
    %c 날짜와 시간 출력 Tue Aug 16 21:30:00 1988
    %x 날짜 출력 08/16/88 (None);08/16/1988
    %X 시간 출력 21:30:00
    %G 년 출력(ISO 8601 형식) 0001, 0002, ..., 2013, 2014, ..., 9999
    %u 요일 출력(ISO 8601 형식) 1, 2, ..., 7
    %V 올해의 지난 주 수 출력(ISO 8601 형식) 01, 02, ..., 53

     

     

     

    *시계열 데이터를 구분해서 추출하고 싶어요

    now 메서드로 얻은 현재 시간의 시계열 데이터는 아주 정밀한 단위까지 시간을 표현합니다. 하지만 원하는 시계열 데이터의 시간 요소가 연도, 월, 일뿐이라면 now 메서드로 얻은 시계열 데이터를 잘라내야 합니다. 다음은 strftime 메서드와 시간 형식 지정자를 이용하여 시계열 데이터를 잘라낸 것입니다.

    now = datetime.now( )
    print(now)

    2018-05-19 13:27:44.959433

    nowDate = now.strftime('%Y-%m-%d')
    print(nowDate)

    2018-05-19

    nowTime = now.strftime('%H:%M:%S')
    print(nowTime)

    13:27:44

    nowDatetime = now.strftime('%Y-%m-%d %H:%M:%S')
    print(nowDatetime)

    2018-05-19 13:27:44

     

     

     

     

     

    datetime 오브젝트로 변환하기 - read_csv 메서드

    앞에서는 to_datetime 메서드를 사용하여 문자열로 저장되어 있는 Date 열을 datetime 오브젝트로 변환했습니다. 하지만 datetime 오브젝트로 변환하려는 열을 지정하여 데이터 집합을 불러오는 것이 더 간단합니다. 다음 실습을 통해 알아보겠습니다.

     

     

    datetime 오브젝트로 변환하려는 열을 지정하여 데이터 집합 불러오기

    1. 다음은 read_csv 메서드의 parse_dates 인자에 datetime 오브젝트로 변환하고자 하는 열의 이름을 전달하여 데이터 집합을 불러온 것입니다. 결과를 보면 Date 열이 문자열이 아니라 datetime 오브젝트라는 것을 확인할 수 있습니다.

    ebola1 = pd.read_csv('../data/country_timeseries.csv', parse_dates=['Date'])
    print(ebola.info( ))

    <class 'pandas.core.frame.DataFrame'>>
    RangeIndex: 122 entries, 0 to 121
    Data columns (total 18 columns):
    Date                         122 non-null datetime64[ns]
    ...
    dtypes: datetime64[ns](1), float64(16), int64(1)
    memory usage: 17.2+ KB
    None

     

     

     

     

     

    datetime 오브젝트에서 날짜 정보 추출하기

    datetime 오브젝트에는 년, 월, 일과 같은 날짜 정보를 따로 저장하고 있는 속성이 이미 준비되어 있습니다. 다음 실습을 통해 datetime 오브젝트에서 날짜 정보를 하나씩 추출해 보겠습니다.

     

     

    datetime 오브젝트에서 날짜 정보 추출하기

    1. 다음은 문자열로 저장된 날짜를 시리즈에 담아 datetime 오브젝트로 변환한 것입니다.

    date_series = pd.Series(['2018-02-16', '2018-05-17', '2018-05-18'])
    d1 = pd.to_datetime(date_series)
    print(d1)

    0      2018-05-16
    1      2018-05-17
    2      2018-05-18
    dtype: datetime64[ns]

     

    2. datetime 오브젝트(d1)의 year, month, day 속성을 이용하면 년, 월, 일 정보를 바로 추출할 수 있습니다.

    print(d1[0].year)

    2018

    print(d1[0].month)

    5

    print(d1[0].day)

    16

     

     

     

     

     

    dt 접근자 사용하기

    문자열을 처리하려면 str 접근자를 사용한 다음 문자열 속성이나 메서드를 사용해야 했습니다. datetime 오브젝트도 마찬가지로 dt 접근자를 사용하면 datetime 속성이나 메서드를 사용하여 시계열 데이터를 처리할 수 있습니다.

     

     

    dt 접근자로 시계열 데이터 정리하기

    1. 먼저 ebola 데이터 집합을 불러온 다음 Date 열을 datetime 오브젝트로 변환하여 새로운 열(date_dt)로 추가합니다.

    ebola = pd.read_csv('../data/country_timeseries.csv')
    ebola['date_dt'] = pd.to_datetime(ebola['Date'])

     

    2. 다음은 dt 접근자를 사용하지 않고 인덱스가 3인 데이터의 년, 월, 일 데이터를 추출한 것입니다.

    print(ebola[['Date', 'date_dt']].head( ))

                     Date        date_dt
    0        1/5/2015   2015-01-05
    1        1/4/2015   2015-01-04
    2        1/3/2015   2015-01-03
    3        1/2/2015   2015-01-02
    4    12/31/2014   2014-12-31

    print(ebola['date_dt'][3].year)

    2015

    print(ebola['date_dt'][3].month)

    1

    print(ebola['date_dt'][3].day)

    2

     

    3. 과정 2와 같은 방법은 date_dt 열의 특정 데이터를 인덱스로 접근해야 하기 때문에 불편합니다. 다음은 dt 접근자로 date_dt 열에 한 번에 접근한 다음 year 속성을 이용하여 연도값을 추출한 것입니다. 추출한 연도값은 ebola 데이터프레임의 새로운 열(year)로 추가했습니다.

    ebola['year'] = ebola['date_dt'].dt.year

    print(ebola[['Date', 'date_dt', 'year']].head( ))

                     Date        date_dt     year
    0        1/5/2015   2015-01-05   2015
    1        1/4/2015   2015-01-04   2015
    2        1/3/2015   2015-01-03   2015
    3        1/2/2015   2015-01-02   2015
    4    12/31/2014   2014-12-31   2014

     

    4. 다음은 과정 3을 응용하여 월, 일 데이터를 한 번에 추출해서 새로운 열(month, day)로 추가한 것입니다.

    ebola['month'], ebola['day'] = (ebola['date_dt'].dt.month, ebola['date_dt'].dt.day)

    print(ebola[['Date', 'date_dt', 'year', 'month', 'day']].head( ))

                     Date        date_dt     year   month   day
    0        1/5/2015   2015-01-05   2015           1      5
    1        1/4/2015   2015-01-04   2015           1      4
    2        1/3/2015   2015-01-03   2015           1      3
    3        1/2/2015   2015-01-02   2015           1      2
    4    12/31/2014   2014-12-31   2014         12    31

     

    5. 오른쪽은 ebola 데이터프레임에 새로 추가한 date_dt, year, month, day 열의 자료형을 출력한 것입니다. date_dt 열은 datetime 오브젝트이고 나머지는 정수형이라는 것을 알 수 있습니다.

    print(ebola.info( ))

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 122 entries, 0 to 121
    Data columns (total 22 columns):
    Date                         122 non-null datetime64[ns]
    Day                          122 non-null int64
    ...
    date_dt                    122 non-null datetime64[ns]
    year                         122 non-null int64
    month                      122 non-null int64
    day                          122 non-null int64
    dtypes: datetime64[ns](2), float64(16), int64(4)
    memory usage: 21.0+ KB
    None

     

     

     

     

     

     

    출처 : "판다스 입문"

Designed by Tistory.