Pandas: 날짜 다루기, 사용자 정의 함수 적용하기, 데이터 결합하기
날짜 다루기
다음으로, 날짜를 다루는 방법에 대해 알아보겠습니다. 날짜가 문자형으로 되어 있다면 날짜 계산이 불가능합니다. 날짜를 날짜형 데이터로 변경해주어야 날짜를 계산할 수 있습니다. 데이터를 날짜 형태로 변경하기 위해서는 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