링고선생님의 파이썬 데이터분석 프로젝트 강의!
강의자료로는 3-6 Dates&Times 내용이다. 강의는 홈페이지에서 구매할 수 있음..!(사진 누르면 링크 이동)
🔥 강의 목차
오리엔테이션
파이썬 기초 문법
데이터 전처리
데이터 시각화
마케팅 데이터 분석 및 지표 정의하기
데이터를 분석하기 전 가장 먼저 해야 할 일이 무엇일까? 어떤 컬럼, 어떤 값들로 구성되어 있는지 데이터를 눈으로 쭉 훑은 다음, info()로 데이터타입을 확인해야 한다.
만약 숫자의 합계를 계산하려고 하는데, 데이터타입이 문자형이라면 제대로 된 계산 결과가 나오지 않는다. 문자 "9"와 "10"을 합하면 "910"이 되고, 19라는 결과가 나오지 않는다. 이럴 때는 데이터타입을 int 또는 float 형태로 변경해야 원하는 결과를 얻을 수 있다.
또 하나 조심해야 할 것이 오늘 배우는 날짜/시간 데이터타입이다. 데이터타입이 object로 되어 있으면 오늘 배우는 날짜/시간 데이터를 다루는 코드들이 제대로 작동하지 않기 때문에 꼭 확인하고 변경해줄 것!
🔥 날짜/시간 형태로 변경(to_datetime)
강의에서는 '택시' 데이터를 사용했다. pickup이라는 컬럼은 택시에 탑승한 시각을 의미한다. dropoff는 택시에서 내린 시간. 그러나, info()를 출력해 보면, 두 컬럼 모두 object 타입임을 알 수 있다.
df.info()
이럴 때 날짜/시간 형태로 데이터타입을 변경하는 코드가 pd.to_datetime(df['컬럼명']) 이다.
판다스에 있는 기능이므로 사용하기 전 반드시 판다스 라이브러리를 import 해주어야 한다.
그리고 나서 다시 info()를 출력하면 데이터타입이 datetime으로 변경된 것을 볼 수 있다.
import pandas as pd # 판다스 라이브러리 import
df['pickup'] = pd.to_datetime(df['pickup']) # datetime 형태로 데이터타입변경
df.info()
🔥 기간 형태로 변경(to_period)
다음은 주어진 날짜/시간 데이터를 주기('M', 'W', 'Y' 등)로 변환하는 구문이다.
df['col'].dt.to_period('period')
# to_period('period') : Daily(D), Weekly(W), Monthly(M), Yearly(Y) 등 주기로 나타냄
df['기존컬럼'].dt.to_period('원하는 주기') 로 사용한다. '원하는 주기'에 들어갈 수 있는 것은 D, W, M, Y이다. Daily(D), Weekly(W), Monthly(M), Yearly(Y)를 뜻한다. 대상 컬럼이 datetime 타입이 아닌 경우 오류가 발생한다.
아래는 주기를 weekly(W)로 했을 때 나타나는 출력 결과이다.
실제로 2019년 3월 달력을 보면 3/4(월)~3/10(일), 3/11(월)~3/17(일), 3/18(월)~3/24(일), 3/25(월)~3/31(일) 요런 식임!
원래 데이터에서 0번 인덱스의 pickup 날짜는 2019-03-23 20:21:09 이므로, 'W' 값은 3월 18일(월)~3/24일(일) 에 해당한다.
데이터타입은 period[W-SUN] 이다.
'3월 18일에서 24일인 주' 라고 말하기 보다는 '3월 18일로 시작하는 주'라고 하는 게 더 간단할 수 있다.
그럴 때는 dt.to_period() 뒤에 dt.strftime('%Y-%m-%d') 를 붙여서 한 주의 첫 날만 표시할 수 있다.
이때는 데이터타입이 object로 변경되는 것도 알아두면 좋다.
df['col'].dt.to_period('period').dt.strftime('%Y-%m-%d')
# to_period('period') : Daily(D), Weekly(W), Monthly(M), Yearly(Y) 등 주기로 나타냄
# dt.strftime('%Y-%m-%d') : 'YYYY-MM-DD' 형태로 표시함
🔥 처음부터 datetime 형태로 데이터 가져오기(parse_dates = ['col1', 'col2'])
데이터를 가져온 다음 pd.to_datetime()을 사용하여 날짜/시간 데이터로 변경할 수도 있지만, 애초에 불러올 때 특정 컬럼들을 datetime 형태로 불러올 수도 있다. pd.read_csv()로 데이터를 불러올 때 뒤쪽에 , parse_dates = ['컬럼명', '컬럼명2'...] 와 같이 붙여주면 된다. 역시 판다스 라이브러리를 import 하고 사용!
import pandas as pd # 판다스 라이브러리
df= pd.read_csv('/content/drive/MyDrive/강의노트/taxis.csv'
, parse_dates = ['pickup', 'dropoff']) # 두 컬럼을 datetime 형태로
df.info()
불러온 직후 info()로 확인해도 두 컬럼이 datetime 형태로 표시되는 것을 볼 수 있음
🔥 날짜/시간 데이터 계산(timedelta)
강의에서는 어째서인지 timedelta라는 제목이지만 그냥 뺄셈 형태로 나타냈다.
따로 조사하니, timedelta()를 사용하면 특정 날짜로부터 N일 후, n초 뒤, 이런 것들을 계산할 수 있다.
일단, 아래와 같이 오늘 날짜를 나타내는 today 변수를 만들어주자. 오늘 날짜는 2024.05.19(일)
import datetime
today = datetime.date.today()
today
'100일 후'를 의미하는 timedelta를 이용하여 days100이라는 변수를 하나 더 만들었다. 오늘 날짜랑 합치면 100일 후인 8월 27일이 나온다.
days100 = datetime.timedelta(days=100)
today + days100
다시 강의에서 배운 내용으로 돌아가서, 두 컬럼 간 날짜/시간의 차이를 계산할 수 있다.
여기에서는 택시에서 내린 시간(dropoff)에서 탄 시간(pickup)을 빼면 택시로 이동한 시간을 계산할 수 있다.
그럼 아래와 같이 N days HH:MM:SS 형태로 나타난다.
df.dropoff - df.pickup
6분 15초 탑승했다는 내용인데, 0 days 00:06:15와 같이 나타나면 알아보기 힘들다.
이럴 때는 dt.total_seconds()로 초 단위로 변경한 다음 나누기 60으로 다시 분 단위로 변경할 수 있다.
먼저 dt.total_seconds()를 사용해 시간 차이를 '초' 단위로 변경하고,
(df.dropoff-df.pickup).dt.total_seconds() # 초 단위로 변경
여기에다 나누기 60을 해서 분 단위로 바꿀 수 있다.
(df.dropoff-df.pickup).dt.total_seconds()/60 # 나누기 60해서 분으로
분 단위로 계산한 값을 minute_pickup_to_dropoff 라는 이름의 새 컬럼에다 저장해주면 '몇 분 동안 택시를 탑승했는지' 알 수 있는 컬럼 하나가 추가된다.
df['minute_pickup_to_dropoff'] = (df.dropoff-df.pickup).dt.total_seconds()/60
df.head()
datetime 형태의 데이터를 다루는 건 엄청 많이 쓰이기도 하고, 중요한 부분이니까 연습을 많이 해야 할 것 같다. 🔥
* 본 게시글은 '메타코드'의 동의를 받아 작성된 글로, 강의 내용에 대한 모든 저작권은 Ringo 선생님에게 있습니다. 개인용도의 학습 외에 무단사용은 엄격히 금지됩니다. 위반 시 법적 조취가 취해질 수 있습니다.
'빅데이터분석' 카테고리의 다른 글
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (13) 결합: 세로로 결합/가로로 결합(JOIN, Merge) (0) | 2024.05.26 |
---|---|
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (12) groupby 그룹별 집계하기 (1) | 2024.05.19 |
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (10) 조건에 맞는 데이터 필터링(filtering) (0) | 2024.05.12 |
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (9) 인덱싱(indexing)과 데이터 정렬(sorting) (0) | 2024.05.12 |
[파이썬] 파이썬 입문 데이터분석 프로젝트 만들기 - (8) 시리즈 Series (0) | 2024.05.05 |