본문 바로가기

Data Handling/Data Preprocessing

시간별 데이터를 일자별 데이터로 변환하기

다음과 같은 날씨 데이터가 있습니다.

2018-02-01 부터 2020-05-18 까지의 시간별 기온데이터로, 

지역별(184, 185, 188, 189)로 각각 정리되어 있습니다.

 

weather

 

해당 데이터를 일자별로 정리하되,

모든 지역을 고려한 일자별 최소, 최대, 평균 기온의 형태가 필요하다고 합니다. 

이런 형태로 말이죠 :)

daily_temperature

 

시작해 볼까요?

 

 


 

 

순서

  1. 시간별 지역들의 기온을 평균내거나 중앙값을 사용하여 지역을 없애기

  2. 시간별 기온에서 최소, 최대, 평균 기온을 추출하기

 


 

1. 시간별 지역들의 기온을 평균내거나 중앙값을 사용하여 지역을 없애기

 

지역의 속성을 모두 고려하기 위해 다음과 같은 데이터 형태를 만들어야 합니다. 

 

밑으로 쭉 붙어있는 데이터를 같은 시간 기준으로 오른쪽으로 붙이는 작업을 해야겠네요.

블로그 '문법' 카테고리의 'concat vs merge'에 대한 포스팅을 보시면 필요한 문법이 merge인 것을 알 수 있겠죠? 

코드를 한번 작성해 보겠습니다.

# 지역별로 한 뭉텅이를 만들어서 하나의 리스트에 넣어줍니다
weather_list = []
for area in weather['area'].unique():
    weather_list.append(weather[weather['area']==area].copy())
    
# 불필요해진 area열을 버리고, 대신 기온 열에 area 정보를 추가해줍니다
for i, area in enumerate(weather['area'].unique()):
    weather_list[i].drop(['area'],axis=1,inplace=True)
    weather_list[i].columns = ['datetime',str(area)+'_temp']

weather_list # 출력

 

 

이제 새로운 데이터 프레임을 생성해서 for문과 merge를 이용해 한 뭉텅이씩 붙여볼게요

# 데이터 프레임 생성
start = '2018-02-01'
end = '2020-05-18'
hourly_temperature = pd.DataFrame(columns = ['datetime'])
date_range = pd.date_range(start,end,freq = 'H')
hourly_temperature['datetime'] = date_range

# 'datetime'을 기준으로 오른쪽으로 병합하기
for d in weather_list:
    hourly_temperature = hourly_temperature.merge(d,how='outer')
    
hourly_temperature # 출력

 

 

완성이 됐습니다.

이제 중앙값을 이용해서 기온을 하나의 열로 나타내고, 결측치는 이후의 값으로 대체하겠습니다.

# 중앙값 추출
hourly_temperature['median'] = hourly_temperature.median(axis=1)
hourly_temperature = hourly_temperature.loc[:,['datetime','median']]
hourly_temperature.columns = ['date','temperature']

# 결측치 처리
hourly_temperature['temperature'][hourly_temperature['temperature'].isna()] = hourly_temperature.shift(-1)['temperature'][hourly_temperature['temperature'].isna()]

hourly_temperature # 출력

 

 

2. 시간별 기온에서 최소, 최대, 평균 기온을 추출하기

 

하루 중 최소, 최대, 평균 기온을 찾으려면 지역의 중앙값을 구하기 위해 행으로 나타냈듯, 하루의 24시간을 행으로 나타내야겠죠?

# 데이터 프레임 만들기
start = '2018-02-01'
end = '2020-05-18'
daily_temperature = pd.DataFrame(columns = ['date'])
date_range = pd.date_range(start, end, freq='D')
daily_temperature['date'] = date_range

# 24시간을 한 행으로 만들기
for d in range(daily_temperature.shape[0]):
    for h in range(24):
        daily_temperature.loc[d, 'temp_h'+str(h)] = hourly_temperature['temperature'][d*24:d*24+24][d*24+h]
        
daily_temperature.head() # 출력        

 

 

이제 최대, 최소, 평균 기온을 구한 후, 나머지 속성은 지워도 될 것 같습니다 !!

# 최대, 최소, 평균값 추출
daily_temperature['temp_max'] = daily_temperature.loc[:,'temp_h0':].max(axis=1)
daily_temperature['temp_min'] = daily_temperature.loc[:,'temp_h0':].min(axis=1)
daily_temperature['temp_mean'] = daily_temperature.loc[:,'temp_h0':].mean(axis=1)

# 불필요한 정보 삭제
daily_temperature = daily_temperature[['date','temp_max','temp_min','temp_mean']]

daily_temperature # 출력

 

 


 

결론

데이터에서 최소/ 최대/ 평균 등을 쉽게 찾기 위해서는 일단 하나의 행으로 만드는 것이 중요하다.