Pandas/시계열 데이터

김홍찬·2023년 1월 22일

학습내용

  • pandas에서 시계열 데이터 다루기

시계열 데이터란?

  • 시간의 흐름에 따라 수집된 데이터

파이썬과 판다스의 날짜/시간 데이터 다루기

  • 파이썬은 datetime 모듈을 이용한다.
    datetime 모둘은 날짜/시간 관련 타입으로 date, time, datetime 클래스를 제공한다.

  • 판다스는 Timestamp, 단일 타입을 사용한다.
    Timestamp는 나노초(10억분의 1초)의 정밀도를 가진다.

  • 파이썬과 판다스모두 timedelta를 이용해 일시의 차이를 관리한다.

파이썬 datetime


import datetime  
d = datetime.date(year=2023, month=1, day=2) 
t = datetime.time(hour=14, minute=40, second=20, microsecond=999999) 
dt = datetime.datetime(year=2022, month=12, day=30, hour=11, minute=30, second=10, microsecond=999999)

print(f"date: {d}\ntime: {t}\ndatetime: {dt}")

date: 2023-01-02
time: 14:40:20.999999
datetime: 2022-12-30 11:30:10.999999
-------------------------------------
# 실행시점의 날짜, 일시 조회도 가능하다.

from datetime import datetime, time, date

print('현재날짜:', date.today())
print('현재 일시:', datetime.now())

현재날짜: 2023-01-22
현재 일시: 2023-01-22 21:30:56.958436

timedetla를 이용한 시간 계산

  • 특정 날짜나 시간에서 일정 기간을 더하거나 뺀 일시를 계산할 때 사용
  • 날짜와 시간 간의 차이를 계산한 결과로 사용
  • 객체 생성시 weeks, days, hours, minutes, seconds, milliseconds, microseconds를 넣어 표시한다.
# 현재 시간에 설정한 시간 빼기/더하기
from datetime import timedelta

tdelta = timedelta(weeks=2, days=3, hours=5, minutes=30, seconds=30, milliseconds=100, microseconds=100000)

c = datetime.now()

print(c)
print(c - tdelta)
print(c + tdelta)

2023-01-22 21:36:46.639851
2023-01-05 16:06:16.439851
2023-02-09 03:07:16.839851

----------------------------------
date(2023,1,22) - date(2023,1,1) 

# 벌써 21일이나 지난걸 확인 했다.
datetime.timedelta(days=21)

datetime의 문자열 변환

# strftime()

today = date.today()

dow = list('월화수목금토일')
print(dow)

# datetime.weekday => 요일을 정수로 반환해준다. (0: 월요일, 6: 일요일)
# 리스트 인덱스 6번인 일요일 반환.
print(dow[today.weekday()]) 

print(today)
print(today.strftime(f'%Y년 %m월 %d일 %a {dow[today.weekday()]}요일'))
curr = datetime.now()
print(curr)
print(curr.strftime('%Y/%m/%d %H, %I %p'))

['월', '화', '수', '목', '금', '토', '일']
일
2023-01-22
2023년 01월 22일 Sun 일요일
2023-01-22 21:42:01.785412
2023/01/22 21, 09 PM
-----------------------------------

# strptime

#문자열 -> datetime
s = '2000년 10월 30일'
datetime.strptime(s,'%Y년 %m월 %d일')

datetime.datetime(2000, 10, 30, 0, 0)

판다스 Timestamp

  • unix time 부터 계산하여 생성
    • 1970년 1월 1일 0시 0분 0초 0나노초
import pandas as pd

# 직접 원하는 일시를 넣어서 생성
pd.Timestamp(year=2020, month=11, day=21, hour=17, minute=30, second=10, microsecond=1, nanosecond=1)

Timestamp('2020-11-21 17:30:10.000001001')
--------------------------------------
# 날짜 : '/'나 '-'로 구분자를 사용
# 시간: ':'을 구분자로 사용
# 더 간단하다.

pd.Timestamp('2023/1/12 12:24:30.12111')
pd.Timestamp('2023-1-12 12:24:30.12111')

Timestamp('2023-01-12 12:24:30.121110')
-------------------------------------
#  기준은 유닉스 타입이다.

 # 10년 경과한 날짜
 print(pd.Timestamp(10, unit='Y')) 
 
 # 10개월 경과한 날짜
 print(pd.Timestamp(10, unit='M'))
 
 # 10주 경과한 날짜
 print(pd.Timestamp(10, unit='W'))
 
1980-01-01 10:12:00
1970-11-01 08:51:00
1970-03-12 00:00:00 

to_datetime() 메소드

  • 날짜와 관련된 다양한 값들을 Timestamp로 변환
  • Series나 리스트의 값들을 한번에 변환할 수 있다.
# day

s1 = pd.Series([10,100,1000,10000])
pd.to_datetime(s1, unit='D')

0   1970-01-11
1   1970-04-11
2   1972-09-27
3   1997-05-19
dtype: datetime64[ns]
--------------------------------------
# 년 월 일 포멧을 to_datetime이 모른다.

s3 = pd.Series(['2000년 01월 01일', '2001년 03월 10일', '2023년 10월 12일'])
pd.to_datetime(s3)

parsing error 발생
-------------------------------------
# 형식을 지정해 주면 년 월 일 포멧도 사용 가능.

s3 = pd.Series(['2000년 01월 01일', '2001년 03월 10일', '2023년 10월 12일'])
pd.to_datetime(s3, format='%Y년 %m월 %d일') 

0   2000-01-01
1   2001-03-10
2   2023-10-12
dtype: datetime64[ns]

Timestamp 간 연산 및 TimeDelta

s1 = pd.to_datetime(pd.Series(['2010-01-01','2010-03-01','2010-06-01']))
s2 = pd.to_datetime(pd.Series(['2012-01-01','2012-03-01','2012-06-01']))
print(s1)
print(s2)

0   2010-01-01
1   2010-03-01
2   2010-06-01
dtype: datetime64[ns]
0   2012-01-01
1   2012-03-01
2   2012-06-01
dtype: datetime64[ns]
---------------------------------------
# 같은 인덱스의 원소끼리의 날짜 차이 계산

result = s2 - s1
result

0   730 days
1   731 days
2   731 days
dtype: timedelta64[ns]
--------------------------------------

# TimeDelta 객체 생성

t_delta = pd.Timedelta(days=3) 
t_delta2 = pd.Timedelta(weeks=2, days=3) 

# s1의 날짜에서 2주 3일 전 날짜를 계산
print(s1 - t_delta2)

0   2009-12-15
1   2010-02-12
2   2010-05-15
dtype: datetime64[ns]

profile
바쁘다 바빠

0개의 댓글