취뽀 기록

#열심히 살자 #취업 #공부

Python/[개념 및 문법]

[판다스] 시계열 객체 변환, 시계열 데이터 만들기, 날짜 데이터 분리, 날짜 인덱싱

hyunnn_00 2023. 6. 19. 11:36

시계열 데이터를 만들어보자

옵션
-----------------------------------------------------------------------
- start : 시작 날짜 
- end : 종료 날짜 
- periods : Timestamp 개수 
- freq : 빈도(월 간격, 월 시작일 등)
- tz : 시간 기준

 

# Timestamp 배열 = range()
sd_ts = pd.date_range(start = "2022-01-01", # 시작 날짜
                      end = None, # 끝 날짜
                      periods = 12, # Timestamp 개수
                      freq = 'MS', # 월 간격, 월 시작일
                      tz = 'Asia/Seoul')
print(sd_ts)

 

sd_ts = pd.date_range(start = "2022-01-01", # 시작 날짜
                      end = None, # 끝 날짜
                      periods = 12, # Timestamp 개수
                      freq = 'M', # 월 간격, 월 마지막일
                      tz = 'Asia/Seoul')
print(sd_ts)

 

sd_ts = pd.date_range(start = "2022-01-01", # 시작 날짜
                      end = None, # 끝 날짜
                      periods = 12, # Timestamp 개수
                      freq = '3M', # 3개월 간격, 월 마지막일
                      tz = 'Asia/Seoul')
print(sd_ts)

freq 옵션
-----------------------------------------------------------------------

- M : 월 간격
- H : 1시간 간격 (ex) 2H -> 2시간 간격 

 


날짜 데이터 분리

데이터의 데이터 타입을 확인해보았더니 Date가 object 형식이다.

따라서 먼저 형식을 datetime으로 변환해주자! 

df.info()
----------------------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Date    20 non-null     object
 1   Close   20 non-null     int64 
 2   Start   20 non-null     int64 
 3   High    20 non-null     int64 
 4   Low     20 non-null     int64 
 5   Volume  20 non-null     int64 
dtypes: int64(5), object(1)
memory usage: 1.1+ KB
df['Date_new'] = pd.to_datetime(df['Date'])
df.info()
--------------------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 7 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   Date      20 non-null     object        
 1   Close     20 non-null     int64         
 2   Start     20 non-null     int64         
 3   High      20 non-null     int64         
 4   Low       20 non-null     int64         
 5   Volume    20 non-null     int64         
 6   Date_new  20 non-null     datetime64[ns]
dtypes: datetime64[ns](1), int64(5), object(1)
memory usage: 1.2+ KB

 

Date 컬럼의 데이터 타입을 변경한 컬럼을 Date_new 컬럼으로 새롭게 만들었다.

Date_new 컬럼의 기본 형식은 2018-01-01 과 같은 년-월-일 데이터이다.

 

여기서 년도가 궁금하다면?

=> dt.year을 붙이면 된다.

# Timestamp
# 연-월-일 데이터에서 연, 월, 일 추출
print(df['Date_new'])
print(df['Date_new'].dt.year)

 

month가 궁금하다면?

=> dt.month를 붙이기

print(df['Date_new'].dt.month)

day가 궁금하다면?

=> dt.day 붙이기

print(df['Date_new'].dt.day)


to_period

to_period 메서드는 DatetimeIndex를 PeriodIndex로 변환하는 메서드이다.

사용 방법
------------------------------------------------------------------------------
df.to_period(freq=None, axis=0, copy=True)

freq
 : 원하는 시간 단위로 변환 가능
axis
 : 변환할 기준 축 
copy
 : 사본을 형성할지 여부
idx = pd.date_range(start='2021-08-01',periods=5,freq='45D') # 45일 간격 인덱스
>>
DatetimeIndex(['2021-08-01', '2021-09-15', '2021-10-30', '2021-12-14',
               '2022-01-28'],
              dtype='datetime64[ns]', freq='45D') # 형식은 datetime64

 

* freq 값을 지정하여 원하는 시간간격으로 출력 가능

# freq="Y"

print(idx.to_period("Y"))
>>
PeriodIndex(['2021', '2021', '2021', '2021', '2022'], dtype='period[A-DEC]')
----------------------------------------------------------------------------------------
# freq="M"

print(idx.to_period("M"))
>>
PeriodIndex(['2021-08', '2021-09', '2021-10', '2021-12', '2022-01'], dtype='period[M]')
----------------------------------------------------------------------------------------
# freq="W"

print(idx.to_period("W"))
>>
PeriodIndex(['2021-07-26/2021-08-01', '2021-09-13/2021-09-19',
             '2021-10-25/2021-10-31', '2021-12-13/2021-12-19',
             '2022-01-24/2022-01-30'],
            dtype='period[W-SUN]')
----------------------------------------------------------------------------------------            
# freq="H"

print(idx.to_period("H"))
>>
PeriodIndex(['2021-08-01 00:00', '2021-09-15 00:00', '2021-10-30 00:00',
             '2021-12-14 00:00', '2022-01-28 00:00'],
            dtype='period[H]')

 

위의 df 데이터에서 to_period 메서드를 적용해보자.

# Period
print(df['Date_new'])
print(df['Date_new'].dt.to_period(freq = 'A')) # 연
------------------------------------------------------
0    2018-07-02
1    2018-06-29
2    2018-06-28
3    2018-06-27
4    2018-06-26
5    2018-06-25
6    2018-06-22
7    2018-06-21
8    2018-06-20
9    2018-06-19
10   2018-06-18
11   2018-06-15
12   2018-06-14
13   2018-06-12
14   2018-06-11
15   2018-06-08
16   2018-06-07
17   2018-06-05
18   2018-06-04
19   2018-06-01
Name: Date_new, dtype: datetime64[ns]
0     2018
1     2018
2     2018
3     2018
4     2018
5     2018
6     2018
7     2018
8     2018
9     2018
10    2018
11    2018
12    2018
13    2018
14    2018
15    2018
16    2018
17    2018
18    2018
19    2018
Name: Date_new, dtype: period[A-DEC]

 

 

날짜 인덱싱

df['2018], df['2018-06'] 등으로 2018년, 2018년 6월의 데이터만 추출 가능

 

loc 메서드도 사용 가능

df.loc['2018-06','High':'Low'] # 연월 & High 열부터 Low 열까지

 

# 날짜 1부터 날짜 2까지의 데이터만 추출도 가능

df.loc['2018-06-02':'2018-06-16']

 

※ 여기서 주의할 점

날짜 데이터의 loc는 끝 날짜를 포함한다.

 

# 끝나는 날짜 포함
df.loc['2018-06-02':'2018-06-18']

 

# 오늘 날짜 기준으로 차이점으로 인덱싱도 가능

# difference
today = pd.to_datetime('2023-06-02')
df['day_diff'] = today - df.index

df.set_index('day_diff', inplace = True)

df['1801 days':'1810 days']