[Python] (메소드 정리 4편) 날짜 및 시간(datetime) 데이터타입 메소드

전도운·2024년 7월 19일
0
post-custom-banner

필자는 그동안 접한 많은 메소드들 중에서 날짜와 시간 데이터타입의 메소드가 가장 헷갈렸다. 다른 데이터타입과 달리 날짜/시간데이터는 메소드의 사용방식이 다양하고 복잡하다. 이번 포스트를 통해 핵심적인 내용을 중심으로 날짜/시간데이터 메소드를 정리해보자.

  • 날짜 및 시간 데이터타입이란?

    • 날짜 또는 시간 또는 날짜와 시간을 표시하는 데이터타입을 의미한다. 날짜의 경우 1년은 12개월로, 1달은 각 월에 해당하는 일수를 고려하여 값이 변해야하며 시간의 경우 1시간은 60분, 1분은 60초 등 60진법을 준수하여야 한다. 따라서 이러한 데이터를 다룰 때는 datetime 데이터타입으로 변환을 한 후 처리한다.

    • 세부 데이터타입으로는 연-월-일을 의미하는 date 타입, 연-월-일 시:분:초 등으로 구성된 datetime 타입, 기준시각(1970-01-01 00:00:00) 이후 흘러간 초(seconds)로 구성된 timestamp 타입이 있다. 종류가 SQL의 데이터타입과 유사하므로 자세한 내용은 아래 글을 참고하면 된다.
      [SQL] 날짜 및 시간 데이터

  • 날짜 및 시간을 다루는 메소드는 크게 datetime 라이브러리 및 pandas 라이브러리에서 제공하고 있다. datetime 라이브러리는 기본에 충실하다는 장점이 있으며, pandas 라이브러리는 사용이 편하다는 장점이 있다.

    • datetime 라이브러리: 주로 date/datetime/timedelta 클래스를 사용한다.

      사용 구문: 라이브러리-클래스-메소드
      import datetime  # datetime 라이브러리를 불러온다.
      datetime.[클래스].[메소드]  # 아래 클래스와 메소드를 조합하여 이용한다.
      • date 클래스: 날짜에 대한 클래스이다.
        클래스 속성으로 year, month, day를 받는다.
        year/month/day/today/weekday/strftime 등의 속성 및 메소드를 제공한다.

        사용 예시
        datetime.date(2024, 7, 19).year
          → 2024
      • datetime 클래스: 날짜 및 시간에 대한 클래스이다.
        클래스 속성으로 year, month, day, hour, minute, second, microsecond, tzinfo를 받는다. (굵은 속성은 필수값)
        date 클래스의 메소드 외에도 hour/minues/second등의 속성 및 메소드를 제공한다.

        사용 예시
        datetime.datetime(2024, 7, 19, 17, 45, 30).minute
          → 45
      • timedelta 클래스: 날짜나 시간의 차이에 대한 클래스이다. 날짜 연산 시 사용되는 매우 중요한 클래스이다.
        클래스 속성으로 days, seconds, microseconds를 받으며, 두 date(time) 클래스 객체를 뺄 경우 자동으로 설정되기도 한다.

        사용 예시
        dt1 = datetime.datetime(2024, 7, 19, 17, 45, 30)
         dt2 = datetime.datetime(2024, 7, 29, 17, 45, 30)
         dt2 - dt1
           → datetime.timedelta(days=10)
        
         dt3 = dt2 + datetime.timedelta(days = 20)
         dt3
           → datetime.datetime(2024, 8, 18, 17, 45, 30)
    • Pandas 라이브러리: to_datetime, date_range 함수 외에 shift, resample 등의 메소드를 제공하며, dt접근자로 datetime의 속성 및 메소드를 이용할 수도 있다.

      • to_datetime 함수: 문자형식의 날짜/시간 표기를 datetime 타입으로 자동 변환해주는 매우 편리한 함수이다. 연/월/일/시/분/초의 표기가 구분되어 있으면 자동 포맷팅을 적용하며, 그렇지 않은 경우 수동 포맷팅도 가능하다.

        사용 예시
        pd.to_datetime('2024-07-19')
           → Timestamp('2024-07-20 00:00:00')
        
        pd.to_datetime('2024년 7월 20일', format = '%Y년 %m월 %d일')
           → Timestamp('2024-07-20 00:00:00')
      • date_range 함수: 설정한 범위 내에서 동일한 간격으로 datetimeIndex를 자동으로 생성해주는 함수이다. 별도의 datetime 데이터가 없어 이를 생성해야 할 때 유용하게 사용한다.

        사용 예시
        pd.date_range('2024-07-19', '2024-08-19', freq = '3d')
           → DatetimeIndex(['2024-07-19', '2024-07-22', '2024-07-25'
           , '2024-07-28','2024-07-31', '2024-08-03', '2024-08-06', '2024-08-09'
           , '2024-08-12', '2024-08-15', '2024-08-18'], dtype='datetime64[ns]', freq='3D')
        
         pd.date_range('2024-07-19', periods=20, freq = '3d')
           → DatetimeIndex(['2024-07-19', '2024-07-22', '2024-07-25', '2024-07-28'
           ,'2024-07-31', '2024-08-03', '2024-08-06', '2024-08-09','2024-08-12'
           , '2024-08-15', '2024-08-18', '2024-08-21','2024-08-24', '2024-08-27'
           , '2024-08-30', '2024-09-02','2024-09-05', '2024-09-08', '2024-09-11'
           , '2024-09-14'],
                    dtype='datetime64[ns]', freq='3D')
      • resample 메소드: 주어진 시계열 데이터를 동일한 주기에 따라 그룹으로 묶고 그룹 내 다른 열에 대해 연산을 수행할 수 있는 메소드이다. 분기 평균, 1년 평균 등 자료 연산을 매우 손쉽게 할 수 있다. pandas의 groupby 메소드와 유사하며 변수별 범주가 아닌 시계열 범주를 활용하는 점이 다르다.

        사용 예시
        df_covid_2.resample('m', on = '일자').sum()  # 날짜가 index가 아닌 경우 on으로 날짜변수 설정
          → 각 별수의 월별 자료의 합계가 구해짐
      • dt 접근자: 놀랍게도, pandas에서는 dt 접근자를 이용해 데이터프레임의 각 열에 대해서 datetime 속성과 메소드를 적용할 수 있다. 이는 string 타입의 함수를 적용할 때 str 접근자를 쓴 것과 유사하다.

        사용 예시
        df_covid_2.date_col.dt.day_name()
          → date_col의 날짜정보를 통해 요일(Mon, Tue, ..., Sun)정보를 추출
  • 위 내용을 종합해보면 데이터프레임의 형식이 아닌 데이터 가공 시에는 datetime 라이브러리를 활용해야 할 것이며, 데이터프레임 형식 데이터 가공 시에는 pandas를 이용하는 것이 편리해보인다.

  • 다만, datetime의 timedelta 클래스를 이용한 연산은 판다스에서 별도 함수로 제공하지 않으므로 날짜 및 시간 연산이 필요한 경우 datetime 라이브러리를 불러온 후 작업이 필요하다.

profile
의미 있는 한걸음을 추구합니다.
post-custom-banner

0개의 댓글