programming/python

(pandas)파이썬 시간 데이터 보간(누락 데이터)

limmmmm 2022. 10. 27. 17:17
반응형
반응형

#pandas, python

 

아래와 같이 규칙적으로 데이터가 들어오다가 누락되는 상황이 발생하였을 때 보간처리를 하는 방식에 대해 말씀드리겠습니다.

 

전체흐름 : 시간의 차이 계산 - 새로운 데이터 프레임 생성 - 합치기

 

최종 코드는 맨 하단에 정리되어있습니다.

 

1. 세부사항

dif_time = _df['date'].iloc[_idx] - _df['date'].iloc[_idx - 1]

- 이전의 시간과 현재의 시간의 차이를 계산하여 누락이 있는지 확인

if dif_time != pd.Timedelta(minutes=10):
    dif_count = dif_time / pd.Timedelta(minutes=10) - 1

- 차이가 있다면 얼마나 차이가 있는지 계산

_new_df = pd.DataFrame(columns=df.columns)
_new_df['date'] = pd.date_range(start=_df['date'].iloc[_idx - 1] + pd.Timedelta(minutes=10),
                                end=_df['date'].iloc[_idx] - pd.Timedelta(minutes=10), freq="10min")
_new_df['id'] = _id
_df = pd.concat([_df.iloc[:_idx], _new_df, _df.iloc[_idx:]], ignore_index=True)

- 비어있는 DataFrame 생성(컬럼은 같게 하여 같은 형태로 만들어야 됨)

- 차이가 있는 날짜 데이터 생성

  - start : 시작일자(이전의 인덱스 + 기준시간(10분) = 위와 같으면 2022-01-01 00:30:00이 됨)

  - end : 종료일자(현재 인덱스 - 기준시간(10분) = 위와 같으면 2022-01-01 00:40:00이 됨)

  - freq : 주기(위의 예제는 10분 단위로 생성하겠다는 말임)

- 생성된 DataFrame을 concat으로 합치며 마무리

 

2. 전체코드

더보기
df_result = pd.DataFrame(columns=df.columns)

for _id in df['id'].unique():
    print(f'id : {_id} ', end='')
    _df = df[df['id'] == _id]
    _df.reset_index(drop=True, inplace=True)
    _idx = 0
    s = len(_df)
    while len(_df) > _idx + 1:
        _idx += 1
        dif_count = 0
        dif_time = _df['date'].iloc[_idx] - _df['date'].iloc[_idx - 1]
        if dif_time != pd.Timedelta(minutes=10):
            dif_count = dif_time / pd.Timedelta(minutes=10) - 1
            _new_df = pd.DataFrame(columns=df.columns)
            _new_df['date'] = pd.date_range(start=_df['date'].iloc[_idx - 1] + pd.Timedelta(minutes=10),
                                                end=_df['date'].iloc[_idx] - pd.Timedelta(minutes=10), freq="10min")
            _new_df['id'] = _id
            _df = pd.concat([_df.iloc[:_idx], _new_df, _df.iloc[_idx:]], ignore_index=True)
    df_result = pd.concat([df_result, _df], ignore_index=True)

df_result

설명 : id별로 나누어 시간데이터 생성

 

df_result : 최종 합쳐질 데이터 

다른 시간을 원하면 pd.Timedelta, freq의 값을 변경

 

끝~

반응형