본문 바로가기

파이선

시계열 (chap11)

시간 내에서 특정 순간의 타임스탬프

2000년 1월, 2020년도 전체 같은 고정된 기간

시작과 끝 타임스탬프로 표시되는 시간 간격

실험 혹은 경과시간

 

pandas는 표준 시계열 도구와 데이터 알고리즘을 제공

 

  • 날짜, 시간 자료형, 도구
    • 날짜와 시간 자료형 : datatime, time
      • datetime : 날짜+시간+마이크로초까지 포함 (2021-09-15 18:10:31.862057)
        • datetime(2011, 1, 7) : 2011-01-07 00:00:00
        • datetime(2008, 6, 24, 8,15,20,10) :  2008-06-24 08:15:20.000010
          • 년, 월, 일, 시, 분, 초, 밀리세컨드 로 구성된다.
        • timedelta 
          • 시간에 대해서 해당 일자에 +,- 을 수행한다.
          • 여기서 사용되는 인자값은 시간단위이다.
            from datetime import timedelta
            start = datetime(2011, 1, 1)
            print(start)
            a1 = start + timedelta(3)
            print(a1)
            start - 2 * timedelta(12)
            
            # 2011-01-01 00:00:00
            # 2011-01-04 00:00:00
            # datetime.datetime(2010, 12, 8, 0, 0)​
        • 문자열을 datetime 으로 변경하기
          • python의 datetime객체, pandas의 Timestamp객체 모두 동일하게
            → str메소드, strftime메소드 사용이 가능하다
          • strftime 메소드는 날짜 형식에 맞게 stamp.strftime('%Y-%m-%d') 가장 편하게 사용가능
          • from dateutil.parser import parse : 대부분의 날짜 표현 방식을 parsing할 수 있다. 
            • parse('Jan 31, 1997 10:45 PM') → datetime.datetime(1997, 1, 31, 22, 45)
          • pd.to_datetime : pandas의 경우 to_datetime 메소드를 사용한다.
    • 달력 관련 자료형 : calendar
  • 시계열 기초
    • pandas에서 가장 기본적인 시계열 객체는 파이선 문자열 or datetime객체로 표현되는 타임스탬프로 색인된 Series 이다.
      longer_ts = pd.Series(np.random.randn(1000),
                            index=pd.date_range('1/1/2000', periods=1000))
      print(longer_ts)
      longer_ts['2001']


      # 2000.1.1 부터 총 100개의 row를 생성하는데, 수요일인 날짜만 추출한다.
      dates = pd.date_range('1/1/2000', periods=100, freq='W-WED')

  • 날짜 범위, 빈도, 이동
    예) 일별, 월별, 매 15분 같은 상대적인 고정 빈도의 작업
    pandas에서는 리샘플링, 표준 시계열 빈도 모음, 빈도 추론, 고정된 빈도의 날짜 범위를 지원함
    • 날짜 범위 생성하기
      # 해당 날짜 모두 포함해서 DataTimeIndex객체 생성하기
      index = pd.date_range('2012-04-01', '2012-06-01')
      
      # 2012.04.01 포함해서 20일치에 대한 날짜 생성
      pd.date_range(start='2012-04-01', periods=20)
      
      # 종료일이 2012.06.01 포함해서 이전 날짜로 20일치에 대한 날짜 생성
      pd.date_range(end='2012-06-01', periods=20)
      
      
      # 영업 마감일 기준으로 출력
      # ex : 01-31, 02-29,.... 이런 형태로 구성
      # P.428에 freq 옵션 다양하게 있음
      # M(월 마지막일), MS(월 시작일), BMS(월 영업시작일) 등등 설명되어 있음
      pd.date_range('2000-01-01', '2000-12-01', freq='BM')
      
      
      # 시분초도 모두 유지됨
      pd.date_range('2012-05-02 12:56:31', periods=5)
      
      # 시분초 정보 제거하고, 년월일만으로 구성함, normalize=True 사용
      pd.date_range('2012-05-02 12:56:31', periods=5, normalize=True)​
    • 빈도와 날짜 오프셋
      pandas의 빈도는 기본빈도와 배수의 조합으로 이루어 진다.
      • from pandas.tseries.offsets import Hour, Minute
        # 4시간 단위로 구분
        pd.date_range('2000-01-01', '2000-01-03 23:59', freq='4h')
        
        # 1시간30분 단위로 구분
        pd.date_range('2000-01-01', periods=10, freq='1h19min')
        
        # 월별주차를 쉽게 구분 지을 수 있음
        # freq='WOM-3FRI' 매월 3번쩨 금요일을 출력함 
        rng = pd.date_range('2012-01-01', '2012-09-01', freq='WOM-3FRI')​
    • 데이터 시프트
      • 데이터를 시간 축에서 앞이나 뒤로 이동하는 것을 의미한다.
      • Series와 DataFrame은 색인은 변경하지 않고, 데이터를 앞이나 뒤로 시프트를 수행하는 shift메소드를 가지고 있다.
        # 느신한 시프트는 색인을 바꾸지 않기 때문에, 어떤 데이타는 버려지고 NaN처리가 된다.
        ts.shift(2)
        
        # 시프트의 빈도를 알고 있는 경우, 타임스탬프가 채워질수 있게 조치 가능
        ts.shift(2, freq='M')
        
        # 명시적으로 offset을 지정해서 날짜를 조정할수 있다.
        offset.rollforward(now)
        offset.rollback(now)​
  • 시간대 다루기
    • pytz 라이브러리를 사용한다.
    • 각 지역 timezone에 맞도록 데이터 수정이 가능하다.
  • 기간과 기간연산
    • Period클래스를 사용
      • 며칠, 몇개월, 몇분기, 몇해 같은 조건을 걸수 있음
        # 코드에서 freq=정의한 사항을 명확히 정의하고, 이해하는게 중요
        p = pd.Period(2007, freq='A-DEC')
        index = pd.PeriodIndex(values, freq='Q-DEC')
        p = pd.Period('2007', freq='A-JUN')
        p = pd.Period('2012Q4', freq='Q-JAN')​
  • 리샘플링과 빈도 변환
    정의 : 시계열의 빈도를 변환하는 과정
    다운 샘플링 : 상위빈도의 데이터를 하위빈도로 집계
    업샘플링 : 다운의 반대

    resample메소드 :
     - pandas객체에 있음 (빈도변환 관련된 모든 작업에 유용함)
     - groupby와 비슷한 API를 통해서, 데이터를 그룹화 하고 요약함수를 적용하는 방식
     - 유연한 고수준 메소드로, 매우 큰 시계열 데이터를 처리할 수 있다
    • 다운 샘플링
  • 이동창 함수