일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 리스트
- Folium
- SQL
- plt
- 통계학
- 자료구조
- python
- 문제풀이
- 머신러닝
- pandas
- pandas 메소드
- 스터디노트
- 기계학습
- MacOS
- 재귀함수
- 조합
- INSERT
- 등차수열
- 순열
- numpy
- pandas filter
- barh
- 등비수열
- DataFrame
- Slicing
- Machine Learning
- maplotlib
- matplotlib
- tree.fit
- 파이썬
Archives
- Today
- Total
코딩하는 타코야끼
[Pandas] 7-1강_시계열 데이터 다루기 본문
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 과 문자열간 변환
- strftime()
- datetime, date, time 객체를 지정한 형식의 문자열로 변환
- strptime()
- 일시 형태의 문자열로 부터 datetime 객체를 생성한다.
- 요소를 나타내는 주요 형식문자
- %Y, %m, %d : 년, 월, 일
- %H, %M, %S : 시, 분, 초
- https://docs.python.org/ko/3/library/datetime.html#strftime-and-strptime-format-codes
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]
반응형
'[T.I.L] : Today I Learned > Pandas' 카테고리의 다른 글
[Pandas] 7-2강_시계열 데이터 다루기(시계열 데이터셋) (0) | 2023.04.30 |
---|---|
[Pandas] 6강_DataFrame_재구조화 (0) | 2023.04.24 |
[Pandas] 5강_Pandas_DataFrame_합치기 (0) | 2023.04.24 |
[Pandas] 4-2강_pivot_table 및 일괄처리 메소드 (0) | 2023.04.19 |
[Pandas] 4-1강_groupby 관련 메소드 (0) | 2023.04.19 |