데이터 분석/강의 노트

Pandas: 날짜 다루기, 사용자 정의 함수 적용하기, 데이터 결합하기

hyunseo 2024. 7. 4. 16:34

날짜 다루기

다음으로, 날짜를 다루는 방법에 대해 알아보겠습니다. 날짜가 문자형으로 되어 있다면 날짜 계산이 불가능합니다. 날짜를 날짜형 데이터로 변경해주어야 날짜를 계산할 수 있습니다. 데이터를 날짜 형태로 변경하기 위해서는 pd.to_datetime() 함수를 사용합니다.

pd.to_datetime(df['Date'], format='%Y-%m-%d')
# Date   datetime64[ns]

 

to_datetime()의 인자로 날짜형으로 변경을 원하는 컬럼을 넣어줍니다. 이때, format을 통해 날짜의 포맷을 지정해줄 수 있습니다.

 

다음 표는, 자주 사용하는 데이터 형식입니다.

형식 설명
%Y 0을 채운 4자리 연도
%y 0을 채운 2자리 연도
%m 0을 채운 월
%d 0을 채운 일
%H 0을 채운 시간
%M 0을 채운 분
%S 0을 채운 초

 

날짜 포맷 변경하기

이미 날짜형 데이터라면 dt.strftime() 함수를 통해 원하는 포맷으로 변경할 수 있습니다.

df['Date'].dt.strftime('%m-%d %H:%M')

 

dt 연산자

dt를 사용해서 날짜형 데이터를 연도, 월, 일, 요일 등으로 쪼갤 수 있습니다.

연산자 설명
year 연도
month
day
dayofweek 요일(0-월요일, 6-일요일)
day_name() 요일을 문자열로

 

df['Date'].dt.year          # 2024
df['Date'].dt.month         # 07
df['Date'].dt.day           # 04
df['Date'].dt.dayofweek     # 3
df['Date'].dt.day_name()    # 목요일

 

날짜 계산하기

pd.Timedelta() 함수를 사용해서 날을 더하거나 뺄 수 있습니다.

df['Date'] + pd.Timedelta(days=1)
df['Date'] - pd.Timedelta(days=7)

 

하지만 pd.Timedelta()는 날만 더하거나 뺄 수 있고, 월 단위나 연 단위의 연산은 불가능합니다. 이를 해결하기 위해 라이브러리를 추가합니다.

from pandas.tseries.offsets import DateOffset

df['Date'] + DateOffset(months=1)    # 2024-08-04
df['Date'] + DateOffset(years=1)    # 2025-07-04

 

DateOffset()함수를 사용하면 월 단위, 연 단위도 쉽게 더하고 뺄 수 있습니다.

 

날짜 구간 데이터 만들기

날짜 구간 데이터는 날짜 별로 루프를 돌려야 할 때 많이 사용됩니다. pd.date_range() 함수를 사용합니다.

pd.date_range(start='2024-01-01', periods=30, freq='D')
# DatetimeIndex(['2024-01-01', '2024-01-02', ..., '2024-01-30'],
#              dtype='datetime64[ns]', freq='D')

 

  • start : 시작일
  • end : 종료일
  • periods : 기간
  • freq : 주기

주기에 대한 옵션은 다음과 같습니다.

형식 설명
D 일별
W 주별
M 월별 말일
MS 월별 시작일
A 연도별 말일
AS 연도별 시작일

 

기간 이동 계산

기간 이동 계산은 이동평균선을 구할 때 자주 사용되는 함수입니다. 컬럼.rolling().집계함수의 형식으로 사용합니다.

df['ma7'] = df['Temp'].rolling(7).mean()
  Date Temp ma7
0 1981-01-01 20.7 NaN
1 1981-01-02 17.9 NaN
2 1981-01-03 18.8 NaN
3 1981-01-04 14.6 NaN
4 1981-01-05 15.8 NaN
5 1981-01-06 15.8 NaN
6 1981-01-07 15.8 17.057143
7 1981-01-08 17.4 16.585714
8 1981-01-09 21.8 17.142857

 

rolling() 함수에 넘겨준 숫자에 따라 직전 몇 일의 데이터를 집계할 것인지를 선택할 수 있습니다. 꼭 날짜가 아니더라도 행 별로 이동하면서 계산해야 할 때 사용할 수 있습니다.

 

행 이동

shift() 함수를 사용하면 행을 앞 뒤로 이동할 수 있습니다. 예를 들어, 오늘의 온도가 어제의 온도와 비교해서 얼만큼 달라졌는지를 파악하기 위해 온도 옆에 '어제의 온도'를 나타내는 새로운 칼럼을 하나 만들어서 두 날짜를 비교할 수 있습니다. shift() 함수에 넘겨주는 값이 숫자가 양수면 뒤로 밀리고 음수면 앞으로 당겨집니다.

df2['Temp shift1'] = df2['Temp'].shift(1)
df2['pct change'] = (df2['Temp shift1'] - df2['Temp'])/df2['Temp']

 

apply와 map

apply()

apply() 함수는 사용자 정의 함수를 데이터에 정의하고 싶을 때 사용합니다. 타이타닉 데이터셋에서 성인 남성인지 여부를 판별하는 함수를 만들어보겠습니다. 성인의 기준은 20세로 하겠습니다.

 

apply(사용자 정의 함수, axis=축)의 형태로 사용합니다.

def adult_male(x):
    if x['Sex'] == 'male' and x['Age'] > 19:
        return 1
    else:
        return 0

 

df2['adult_male'] = df2.apply(adult_male, axis=1)
df.head(10)

 

map()

map() 함수는 값을 특정 값으로 치환하고 싶을 때 사용합니다. 인자로 매핑 딕셔너리를 받습니다. 데이터셋[컬럼].map(매핑 딕셔너리)의 형태로 사용합니다.

gender_map = {'male':'남자', 'female':'여자'}
df1['Sex_kr'] = df1['Sex'].map(gender_map)
df1.head()

 

데이터 결합

pandas는 두 개의 데이터를 특정 컬럼을 기준으로 병합하는 기능을 제공합니다. 결합 방법에는 아래의 4가지 입니다. pd.merge(데이터1, 데이터2, on=기준칼럼, how=결합방법)의 형태로 사용합니다.

 

여러 가지 결합 방법

 

 


 

 

 

Pandas를 이용한 데이터 가공: 행과 열 가공하기, 결측값 처리하기

이번에는 Pandas로 데이터를 가공하는 방법에 대해 알아보겠습니다. import pandas as pdfile_path = './data/titanic_train.csv'df = pd.read_csv(file_path) 인덱스, 행, 열인덱스인덱스는 데이터프레임에서 각 행의 이

dararium.tistory.com