코딩하는 타코야끼

[Pandas] 7-1강_시계열 데이터 다루기 본문

[T.I.L] : Today I Learned/Pandas

[Pandas] 7-1강_시계열 데이터 다루기

가스오부시 2023. 4. 30. 02:20
728x90
반응형

1. 시계열 데이터개요


📍 시계열 데이터란

  • 시간의 흐름에 따라 수집된 데이터를 말한다.
  • 일반적으로는 시간의 간격이 균등한 고정 빈도(fixed frequency) 데이터가 대부분이지만 불규칙적인 데이터셋도 될 수 있다.
  • 판다스는 날짜를 조작하고 다른 시구간에 대해 집계하고 다른 시간대를 샘플링 하는등의 시계열 데이터 분석을 위한 다양한 기능을 제공한다.

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

  • 파이썬은  datetime  모듈을 이용해 일시를 처리한다. datetime 모듈은 날짜/시간 관련 타입으로  date, time, datetime  세개의 클래스를 제공한다.
  • 판다스는  Timestamp  단일 타입으로 일시를 처리한다.  Timestamp 는 나노초 (10억분의 1초) 의 정밀도를 가진다.
  • 파이썬, 판다스 모두 timedelta를 이용해 일시의 차이를 관리한다.
  • datetime은 date와 time을 합친 값이다.

📍 파이썬 datatime module

🌓  날짜 시간 객체 생성

import datetime  # datetime 모듈 import
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)
# 마이크로 초: 1/100만 초
print(f"date: {d}\\ntime: {t}\\ndatetime: {dt}")
print(dt.year, dt.day, dt.second)
>>>
date: 2023-01-02
time: 14:40:20.999999
datetime: 2022-12-30 11:30:10.999999
2022 30 10
from datetime import datetime, time, date
# 실행시점의 날짜, 일시 조회
print("현재날짜: ", date.today())
print("현재 일시: ", datetime.now())
>>>
현재날짜: 2023-04-25
현재 일시: 2023-04-25 16:16:54.756365

🌓  timedetla 를 이용한 계산

  • datetime간의 간격을 표현한다.
    • 특정 날짜나 시간에서 일정 기간을 더하거나 뺀 일시를 계산할 때 사용
    • 날짜/시간 간의 차이를 계산한 결과로 사용 (두 일시간의 뺄셈의 결과)
    • 차이를 day, second, microsends로 표현한다.
    • 객체 생성시 weeks, days, hours, minutes, seconds, milliseconds, microseconds 를 넣어 차이를 표현한다.
from datetime import timedelta
# tdelta = timedelta(days=1)  # 1일차
# tdelta = timedelta(weeks=1) # 1주일차
tdelta = timedelta(weeks=2, days=3, hours=5, minutes=10, seconds=30, milliseconds=100, microseconds=100000)
c = datetime.now()
print(c)
print(c - tdelta)
print(c + tdelta)
>>>
2023-04-26 12:01:54.924688
2023-04-09 06:51:24.724688
2023-05-13 17:12:25.124688
date(2023, 1, 12) - date(2022, 1, 1) # 날짜 차이를 timedelta
>>>
datetime.timedelta(days=376)
datetime.now() - datetime(2022, 1, 1, 10, 20, 22)
>>>
datetime.timedelta(days=382, seconds=1389, microseconds=128704)

🌓  datetime 과 문자열간 변환

today = date.today()
date
>>>
datetime.date
# dow = ["월요일", "화요일"]
dow = list('월화수목금토일')
print(dow[today.weekday()])  # date.weekday(), datetime.weekday() => 요일을 정수반환 (0: 월, 6:일)

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-12
2023년 01월 12일 Thu 목요일
2023-01-12 16:12:17.065159
2023/01/12 16, 04 PM
s = "2000년 10월 30일"
#  문자열 -> datetime
datetime.strptime(s, "%Y년 %m월 %d일")
>>>
datetime.datetime(2000, 10, 30, 0, 0)

📍 판다스 Timestamp ( pd.TimeStamp( ) )

  • 날짜 시간을 나노초(10억분의 1초) 단위의 정밀도로 표현한다.
  • 다양한 방식으로 객체를 생성할 수 있다.
    • 직접 원하는 일시를 넣어 생성
import pandas as pd
# 직접 원하는 일시를 넣어서 생성
pd.Timestamp(year=2020, month=11, day=21)
pd.Timestamp(year=2020, month=11, day=21, hour=17)
pd.Timestamp(year=2020, month=11, day=21, hour=17, minute=30)
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/2')
pd.Timestamp('2023/1/12 12:23')
pd.Timestamp('2023/1/12 12:23:30.1211')
pd.Timestamp('2023-1-12T12:23:30.1211')  #날짜와 시간 구분: 공백이나 T
>>>
Timestamp('2023-01-12 12:23:30.121100')
  • unix time 부터 계산하여 생성 - 1970년 1월 1일 0시 0분 0초 0나노초
# 유닉스 타입을 기준으로 경과한 날짜.
pd.Timestamp(100)  # 100나노초 경과한 일시
pd.Timestamp(10, unit='Y') # 10년
pd.Timestamp(10, unit="M") # 10개월
pd.Timestamp(10, unit='W') # 10주
>>>
Timestamp('1970-01-01 00:00:00.000000100')
Timestamp('1980-01-01 00:00:00')
Timestamp('1970-11-01 00:00:00')
Timestamp('1970-03-12 00:00:00')

🌓  to_datetime()

  • 날짜와 관련된 다양한 값들을 Timestamp로 변환한다.
  • Series나 리스트의 값들을 한번에 변환할 수 있다.
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]
s2 = pd.Series(['2000-01-01', '2001-03-10', '2023-01-12', 'aklsdlsd']) 
result = pd.to_datetime(s2, errors='coerce') 
#errors: 변환못하는 문자열일 경우 어떻게 처리할지 지정. ignore-무시, coerce: NaT결측치 처리, raise:Exception발생-기본값 
result
>>>
0   2000-01-01
1   2001-03-10
2   2023-01-12
3          NaT
dtype: datetime64[ns]
s3 = pd.Series(['2000년 01월 01일', '2001년 03월 10일', '2023년 01월 12일']) 
pd.to_datetime(s3, format='%Y년 %m월 %d일') # parsing안되는 형식의 일시는 그 형식을 지정해 준다.
>>>
0   2000-01-01
1   2001-03-10
2   2023-01-12
dtype: datetime64[ns]
# 3줄 모두 똑같은 결과 // Date: object -> datetime 타입의 컬럼으로 변환
df2['Date'] = pd.to_datetime(df2['Date'])
df2['Date'] = df2['Date'].astype("datetime64")
df2 = pd.read_csv('data/walmart_stock.csv', parse_dates=[0])  # 0번째 컬럼은 datetime 타입으로 변환해라.
df2.info() 
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1258 entries, 0 to 1257
Data columns (total 7 columns):
 #   Column     Non-Null Count  Dtype         
---  ------     --------------  -----         
 0   Date       1258 non-null   datetime64[ns]
 1   Open       1258 non-null   float64       
 2   High       1258 non-null   float64       
 3   Low        1258 non-null   float64       
 4   Close      1258 non-null   float64       
 5   Volume     1258 non-null   int64         
 6   Adj Close  1258 non-null   float64       
dtypes: datetime64[ns](1), float64(5), int64(1)
memory usage: 68.9 KB

🌓  Timestamp 간 연산 및 TimeDelta

  • element-wise 연산
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']))
s2.dtype
>>>
dtype('<M8[ns]')
result = s2 - s1 # 같은 index의 원소끼리의 날짜 차이 계산
result
>>>
0   730 days
1   731 days
2   731 days
dtype: timedelta64[ns]
result[0]
>>
Timedelta('730 days 00:00:00')
# TimeDelta 객체 생성
# 간격: days, seconds, millseconds, microseconds, minutes, hours, weeks)
t_delta = pd.Timedelta(days=3)
tt_delta = pd.Timedelta(weeks=2, days=3)
s1 + t_delta  # s1의 날짜에서 3일후 날짜를 계산 => element-wise 연산
>>>
0   2010-01-04
1   2010-03-04
2   2010-06-04
dtype: datetime64[ns]
s1 - tt_delta
>>>
0   2009-12-15
1   2010-02-12
2   2010-05-15
dtype: datetime64[ns]
반응형