본문 바로가기
데이터 분석/데이터 전처리

[Pandas] 13. 날짜를 이용하여 데이터 조회하기

by 부자 꽁냥이 2020. 11. 21.

안녕하세요~ 꽁냥이에요.

 

데이터는 시간에 따라서 발생하는 경우가 많지요. 따라서 데이터 속에는 언제 생성되었는지 알려주는 시간 또는 날짜 정보가 포함되어 있지요. 이에 따라 날짜 정보를 이용하여 특정 데이터를 조회하거나 그룹으로 묶어주는 경우가 많이 있어요.

 

이번 포스팅에서는 날짜를 이용하여 데이터를 조회하고 데이터를 그룹화 방법에 대해서 알아보겠습니다. 여기서 다루는 내용은 다음과 같습니다.

 

1. 특정 요일에 해당하는 데이터 조회하기

2. 특정 날짜에 해당하는 데이터 조회하기

3. 특정 날짜 범위에 해당하는 데이터 조회하기

4. 그룹화하기


   1. 특정 요일에 해당하는 데이터 조회하기

먼저 이번 포스팅에서 사용할 데이터를 다운받아주세요. 해당 데이터는 1981년부터 1990년까지의 오스트레일리아 멜버른 평균 기온 데이터입니다.

 

temperatures.csv
0.06MB

 

다운을 받으셨다면 데이터를 불러와주세요.

 

import pandas as pd

df = pd.read_csv('temperatures.csv')

 

 

현재 Date 열에는 문자열로 날짜가 표시되어있습니다. 날짜를 이용하여 데이터를 조회하려면 Date열에 있는 형식을 아래와 같이 datetime으로 바꿔줘야 합니다.

 

## 문자열을 Datetime으로 변환하기
df['Date'] = pd.to_datetime(df['Date'],format='%Y-%m-%d')

 

꽁냥이는 월요일에 해당하는 데이터를 조회할 거예요. 아래 코드를 살펴볼게요.

 

## 월요일인 데이터 조회
df.query('Date.dt.dayofweek == 0') ## 또는 df[df['Date'].dt.dayofweek == 0]

 

line 2

날짜에서 요일을 알아내기 위해서는 dt.dayofweek 함수를 이용합니다. 이 함수는 요일을 숫자로 표시해주는데 '월화수목금토일'을 0~6으로 리턴해줍니다. 월요일에 해당하는 데이터를 조회해야 하므로 숫자 0과 일치하는 데이터를 query함수를 통하여 찾아줍니다.

 

위 코드를 실행하면 다음과 같이 월요일에 해당하는 데이터만 조회된 것을 확인할 수 있습니다.

 

 

앞서 살펴본 것을 토대로 조금 응용해볼게요. 이번에는 월, 수, 금에 해당하는 데이터를 조회해보겠습니다.

 

## 월, 수, 금에 해당하는 데이터 조회
dayofweek = [0,2,4]
df.query('Date.dt.dayofweek in @dayofweek') ## 또는 df[df['Date'].dt.dayofweek.isin(dayofweek)]

 


   2. 특정 날짜에 해당하는 데이터 조회하기

1. 특정 날짜에 해당하는 데이터 조회하기

 

만약 1981년 1월 2일에 해당하는 데이터를 조회하고 싶다면 어떻게 할까요? 아래 코드를 살펴볼게요.

 

## 특정 날짜
target_date = '1981-01-02'
df.query('Date == @target_date') ## 또는 df[df['Date'] == target_date]

 

line 1~2

먼저 찾고 싶은 날짜를 target_date에 문자열로 날짜 형식에 맞게 할당해줍니다(line 1). 다음으로 query함수를 이용하여 해당 날짜에 데이터를 조회합니다(line 2).

 

 

2. 특정 연도에 해당하는 데이터 조회하기

 

이번에는 특정 날짜가 아니라 1990년도에 해당하는 데이터를 조회해볼게요. 

 

target_year = 1990 # 1990년
df.query('Date.dt.year == @target_year') ## 또는 df[df['Date'].dt.year==target_year]

 

line 1~2

먼저 찾고 싶은 연도를 target_year에 넣어줍시다(line 1). 날짜에서 연도를 알아내기 위해 dt.year 함수를 사용했습니다. 마지막으로 query함수를 이용하여 해당 날짜에 데이터를 조회합니다(line 2).

 

 

dt.month와 dt.day를 이용하면 특정 연도뿐만 아니라 특정 월, 특정 일에 해당하는 데이터를 조회할 수 있습니다.

 

target_month = 9 # 9월
df.query('Date.dt.month == @target_month') ## 또는 df[df['Date'].dt.month==target_month]

target_day = 13 # 13일
df.query('Date.dt.day == @target_day') ## 또는 df[df['Date'].dt.day==target_day]
반응형

   3. 특정 날짜 범위에 해당하는 데이터 조회하기

이번에는 1981년 1월 1일부터 1981년 1월 4일까지 데이터를 조회해봅시다.

 

df.query('"1981-01-01"<= Date <= "1981-01-04"')
## 또는 df[(df['Date']>='1981-01-01') & (df['Date']<='1981-01-04')]

 

line 1

query 함수는 날짜의 범위를 부등식처럼 사용할 수 있습니다.

 

 

이번에는 1987년부터 1989년까지의 데이터를 조회해볼게요.

 

df.query('1987 <= Date.dt.year <= 1989') 
## 또는 df[(df['Date'].dt.year >= 1987) & (df['Date'].dt.year <= 1989)]

 

line 1

앞서 본 것과 마찬가지로 query 함수에 날짜 범위를 부등식처럼 써주시면 됩니다. 차이점은 dt.year를 사용하여 연도를 비교한다는 것입니다.

 


   4. 그룹화 하기

이번에는 연도별로 그룹화하여 최고 기온, 최저 기온, 평균 기온을 구해보겠습니다. 아래 코드를 살펴보겠습니다.

 

## 연도별로 그룹화하기
df['Year'] = df['Date'].dt.year
df.groupby('Year')['Temp'].aggregate(['max','min','mean']).reset_index()

 

line 2

먼저 연도별로 그룹화하기 위해 Year 칼럼을 만들어줍니다.

 

line 3

groupby를 이용하여 연도별로 그룹화한 후 aggregate를 이용하여 집계할 항목을 정해줍니다. 최고 기온, 최저 기온, 평균 기온을 구해야 하므로 max, min, mean을 리스트로 담아 aggregate에 넘겨줍니다. reset_index를 이용하여 칼럼 행이 정렬되도록 했습니다.

 

 

여기서 끝내면 뭔가 심심하니 하나만 더해볼까요? 이번엔 요일별 최고 기온, 최저 기온, 평균 기온을 구해보겠습니다. 코드 설명은 앞서 본 것과 거의 동일하므로 생략하겠습니다.

 

## 요일별로 그룹화하기
num_to_day = {
    0 : '월요일',
    1 : '화요일',
    2 : '수요일',
    3 : '목요일',
    4 : '금요일',
    5 : '토요일',
    6 : '일요일',
}

df['Day'] = [num_to_day[k] for k in df['Date'].dt.dayofweek] ## 요일 칼럼
df.groupby('Day')['Temp'].aggregate(['max','min','mean']).reset_index()

 


이번 포스팅에서는 날짜를 이용하여 데이터를 조회하고 그룹화해보는 방법에 대해서 알아보았습니다. 

지금까지 꽁냥이의 글 읽어주셔서 감사합니다. 다음에도 좋은 내용으로 찾아뵐게요. 안녕히 계세요~


 

댓글


맨 위로