Date:     Updated:

카테고리:

태그: , , , ,

💡 파이썬에서 자주 쓰이는 라이브러리, 통계, 데이터 분석에 유용한 라이브러리들을 학습하고 정리한 페이지입니다.
관심분야인 야구에 관한 응용문제를 직접 만들어 풀어보며 학습했습니다.


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.datedetetime.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함수를 사용해줘야만 가능하다.