Python 라이브러리 공부 기록 02. 데이터형
카테고리: Python
태그: calender, datetime, deque, namedtuple, python
💡
파이썬에서 자주 쓰이는 라이브러리, 통계, 데이터 분석에 유용한 라이브러리들을 학습하고 정리한 페이지입니다.
관심분야인 야구에 관한 응용문제를 직접 만들어 풀어보며 학습했습니다.
03. 데이터형
03-01. datetime
datetime.date
모듈은 년, 월, 일로 날짜를 표현할 때 사용하는 모듈이다. 2022년 12월 14일에서 2000년 12월 23일까지의 날짜 차이를 알아보자.
import datetime
day1 = datetime.date(2022,12,14)
day2 = datetime.date(2000,12,23)
diff= day1-day2
print(diff)
print(diff.days)
#결과
8026 days, 0:00:00 #datetime.timedelta 객체
8026
두 날짜를 빼면 datetime.timedelta
객체가 리턴된다. 이 객체에서 days 함수를 적용하면 날짜만 출력해주는 것을 알 수 있다.
더 나아가 datetime.datetime
모듈을 사용하면 년, 월, 일, 시, 분, 초까지 표현할 수 있다.
combine
함수를 사용하여 datetime.date
와 detetime.time
을 합칠 수도 있다.
day3 = datetime.datetime(2022, 12, 14, 14, 10, 55)
print(day3)
print(day3.minute)
#결과
2022-12-14 14:10:55
10
요일은 datetime.date
객체의 weekday
함수를 사용하여 구할 수 있다. 0부터 월요일이고 6이 일요일이다. 만약 월요일을1, 일요일을 7로 리턴하게 하려면 isoweekday()
를 사용할 수 있다.
print(day1.weekday())
print(day1.isoweekday())
#결과
2 #수요일
3 #수요일
❓ 문제.
오늘 날짜에서 김희준 상병의 전역일(2022년 12월 14일)까지 남은 날짜를 구하시오.
그리고 김희준이 태어난지 1000일째 되는 날과 요일을 언제인지 구하시오.
💡 정답.
import datetime
today = datetime.date.today()
end_date = datetime.date(2022,12,14)
diff = end_date - today
print('전역까지 {}일 남았다!'.format(diff.days))
diff_days = datetime.timedelta(days=1000)
birthday = datetime.date(2000,12,23)
result = birthday + diff_days
print(result, result.weekday())
#결과
전역까지 277일 남았다!
2003-09-19 4
03-02. calendar.isleap - 윤년확인
윤년을 확인하는 함수는 조건문을 3개 중첩해서 만드는 번거로움이 있다.
하지만 calendar
모듈에는 간편한 isleap
함수가 있다.
import calendar
print(calendar.isleap(2020))
print(calendar.isleap(2021))
#결과
True
False
03-03. collections.deque - 데크
deque
는 앞과 뒤에서 데이터를 처리할 수 있는 양방향 자료형이다.
a = [1,2,3,4,5]
#위 리스트를 2만큼 오른쪽으로 회전하여 다음과 같은 리스트를 만들어보자.
a = [4,5,1,2,3]
from collections import deque
a = [1,2,3,4,5]
q = deque(a)
q.rotate(2)
print(q)
print(list(q))
#결과
deque([4, 5, 1, 2, 3])
[4, 5, 1, 2, 3]
deque(a)
로 deque
객체를 만들어주고 여기에 rotate
함수를 적용하여 우측으로 회전시킬 수 있다. 좌측으로 회전시키려면 음수를 입력해주면 된다.
또한 deque
는 리스트와 흡사하여 append
, pop
등의 함수를 동일하게 사용할 수 있다.
d = deque([1,2,3,4])
d.append(5) #append는 마지막 index부터 채움
print(d)
d.appendleft(6) #appendleft는 가장 왼쪽 index부터 채움
print(d)
d.pop() #pop은 마지막 index를 삭제
print(d)
d.popleft() #popleft는 가장 왼쪽 index를 삭제
print(d)
#결과
deque([1, 2, 3, 4, 5])
deque([6, 1, 2, 3, 4, 5])
deque([6, 1, 2, 3, 4])
deque([1, 2, 3, 4])
03-04. collections.namedtuple
tuple
은 인덱스를 통해서만 데이터에 접근이 가능하지만, namedtuple
은 인덱스뿐만 아니라 key값으로도 데이터 접근이 가능한 자료형이다.
아래와 같은 튜플들을 key값으로 접근해보자.
data = [
('양현종', 54, 'starting pitcher'),
('최형우', 34, 'designated hitter'),
('김선빈', 3, 'shortstop')
]
첫번째 매개변수는 객체로 만들어주는 것과 같은 이름을 입력한다. 뒤에 따라오는 콤마로 연결된 것들은 player
의 속성이 된다.
from collections import namedtuple
player = namedtuple('player', 'name, number, position')
그리고 아래처럼 namedtuple
의 객체로 데이터를 변환해준다. 두 가지 방식 모두 같은 결과를 만든다. 아래의 _make
함수는 튜플의 요소가 여러개일 때 특히 유용하다.
data = [player(pla[0], pla[1], pla[2]) for pla in data]
data = [player._make(pla) for pla in data]
pla = data[0]
print(pla.name) #이제 name이란 key로 데이터에 접근이 가능해졌다.
print(pla.position)
print(pla)
#결과
양현종
starting pitcher
player(name='양현종', number=54, position='starting pitcher')
그리고 네임드튜플도 튜플처럼 값을 변경할 수 없는 immutable 특성을 갖고 있다. 때문에 값을 그냥 변경할 수는 없고, _replace
함수를 사용해줘야만 가능하다.