pandas.date_range - 주기적인 날짜 데이터 생성하기

2022. 7. 5. 23:06Python

날짜 데이터의 간격이 규칙적이지 않은 경우를 다룰 때, 원하는 주기의 날짜 데이터를 생성하기 위해 pandas의 date_range 함수(메서드)를 활용할 수 있다. 이번 글에서는 date_range의 인자와 주기 설정에 따른 결과 차이에 대해 정리해보았다. 


1. pandas.date_range()

Return a fixed frequency datetimeIndex
pandas.date_range( 
    start=None,
    end=None,
    periods=None,
    freq=None,
    tz=None,
    normalize=False, 
    name=None,
    closed=None, )
  • start / end: 날짜를 생성하기 위한 시작과 끝 값 (string or datetime 형식)
  • periods: 생성하려는 날짜의 개수
  • freq: 생성하려는 날짜들의 간격(주기), 기본값='D' (string or DateOffset 형식)

→ start, end, periods, freq 중 세 개의 파라미터만 지정할 수 있으며, 나머지는 암묵적으로 결정이 된다. 해당 설명은 아래에서 자세히 다루겠다.

 

  •  tz: 타임존 이름 (string or tzinfo 형식)
  • normalize: 시작/끝 날짜를 자정으로 설정, 기본값=False
  • name: 결과 datetimeIndex에 대한 이름 지정
  • closed: 시작과 끝 날짜로 지정한 값을 포함할지 제외할지에 대한 옵션, 기본값=None으로 양쪽 경계값을 포함한다는 의미 {None, 'left', 'right'}

 

2. 사용 예시 및 결과

2.1. start, end, periods

(1) start, end 값만 지정한 경우

pd.date_range(start="2022-01-01", end="2022-01-10")

2022년 1월 1일 (start)과 2022년 1월 10일 (end)을 포함한 날짜 인덱스가 1일 간격으로 생성됨

(freq 기본값이 'D'로 설정되어있기 때문)

 

(2) start, end, periods 값을 지정한 경우

pd.date_range(start="2022-01-01", end="2022-01-10", periods=4)

지정한 날짜 구간을 3등분(4-1)하여 시작과 마지막 날짜를 포함한 4개의 날짜 인덱스를 생성함

 

pd.date_range(start="2022-01-01", end="2022-01-10", periods=5)

지정한 날짜 구간을 4등분(5-1)하여 시작과 마지막 날짜를 포함한 5개의 날짜 인덱스를 생성함

2일 6시간 간격으로 시간 단위로 균등하게 나뉜 것을 확인할 수 있음

 

 

2.2. freq

(1) start, end, freq 값을 지정한 경우

pd.date_range(start="2022-01-01", end="2022-12-31", freq="M")

지정한 날짜 구간에 대해 1달 주기로 날짜 인덱스를 생성함

freq="M"은 월의 마지막 날짜로 데이터를 생성함

 

pd.date_range(start="2022-01-01", end="2022-12-31", freq="3M")

"3M"과 같이 주기를 나타내는 문자 앞에 숫자를 붙여 3달 간격과 같이 원하는 주기를 설정할 수 있음

또한, 2.1의 예시와 다르게 주기를 설정하는 경우 시작일과 마지막일을 정확하게 포함하지 않고,

날짜 구간을 벗어나지 않는 선에서 해당 주기 간격으로 날짜 인덱스를 생성함

 

(2) start, periods, freq 값을 지정한 경우

pd.date_range(start="2022-01-01", periods=3, freq="M")

시작일로부터 1달 간격으로 3개의 날짜 인덱스가 생성된 것을 확인할 수 있음

 

(3) freq - Offset aliases (오프셋 별칭)

 

주기에 활용할 수 있는 별칭은 여기를 참고하면 되고, 이것에 대한 정리는 별도의 글에서 다룰 예정이다.

 

 

2.3. normalize

pd.date_range(start="2022-01-01 12:00:00", end="2022-01-10 12:00:00", periods=5, normalize=False)
pd.date_range(start="2022-01-01 12:00:00", end="2022-01-10 12:00:00", periods=5, normalize=True)

normalize=False (좌), normalize=True (우)

자주 쓰는 기능은 아니지만, 해당 인자의 역할을 알아보기 위해 True/False 출력을 비교해 본 결과, 

start/end 값에 특정 시간이 추가된 경우 해당 시간을 무시하고 입력 값 이전의 0시 기준으로 값을 반환함

따라서, start/end에 날짜만 입력한 경우에는 해당 옵션으로 인한 결과의 차이가 없음

 

2.4. closed

pd.date_range(start="2022-01-01", end="2022-01-10", closed="right")
pd.date_range(start="2022-01-01", end="2022-01-10", closed="left")

closed="right" (좌), closed="left" (우)

왼쪽과 오른쪽 결과를 비교해보면 closed 옵션을 right로 지정한 경우 마지막 값은 포함, 시작 값은 제외하였고, left로 지정한 경우에는 시작 값은 포함, 마지막 값은 제외한 날짜 인덱스를 생성하였음


 

이번 글에서는 규칙적인 날짜 데이터(인덱스)를 생성하기 위한 메서드 date_range에 대해 정리해보았다. 해당 메서드를 활용하면 원하는 기간에 대해 원하는 주기 또는 개수 만큼 날짜 데이터를 생성할 수 있다. 각 인자들의 역할을 이해하여 원하는 날짜 데이터를 생성하는 데 도움이 되면 좋겠다:-)

 

3. 참고

[1] https://pandas.pydata.org/docs/reference/api/pandas.date_range.html

[2] https://pandas.pydata.org/docs/user_guide/timeseries.html#timeseries-offset-aliases