Date 데이터의 조정
내용
Date 클래스
날짜는 date 클래스를 사용하여 조정할 수 있습니다. 이 클래스는 year, month, day
의 속성을 가지고 있다. 또한 요일은 메소드 weekday()
에 의해 확인할 수 있으며 0 ~ 6 사이의 정수를 반환합니다. 각 수치는 다음과 같이 요일을 대표한다.
오늘의 날짜를 나타내기 위해서는 today()
메소드를 사용합니다.
import datetime import pandas as pd
today=datetime.date.today() today
datetime.date(2022, 3, 11)
today.year
2022
today.month
3
today.day
11
today.weekday()
4
print(today)
2022-03-11
date.ctime()
은 날짜를 나타내는 문자열을 반환합니다
today.ctime()
'Fri Mar 11 00:00:00 2022'
날짜 문자(열)과 날짜 인덱스
다음과 같이 날짜 타입인 문자열인 경우 분석을 위해서는 date 형식으로 변환하여야 합니다.
x="2010. 10. 11 오후 3:30:00" type(x)
str
x에서 '오후'를 제거하고 숫자 형식의 문자만을 date 형식으로 변환합니다. 이 변환은 str객체.replace()
메소드를 사용할 수 있습니다. 또한 문자열에서 특정부분만을 변환하기 위해서 str객체.split()
메소드를 사용할 수 있습니다.
x="2010. 10. 11 오후 3:30:00" type(x)
str
x1=x.replace("오후", "") x1
'2010. 10. 11 3:30:00'
문자열인 객체 x1를 Timestamp 형으로 전환하기 위해 pd.to_datatime()
메서드를 적용합니다.
x2=pd.to_datetime(x1);x2
Timestamp('2010-10-11 03:30:00')
pd.to_datetime(x.split("오")[0])
Timestamp('2010-10-11 00:00:00')
위 결과 Timestamp는 pandas의 date 타입으로 하나이상의 값들을 포함하는 리스트 형식일 경우 DatatimeIndex 형태로 표현됩니다. 이 자료형은 date 클래스와 같이 .year, .month, .day
속성을 가지고 있어 각각을 호출할 수 있습니다. 또는 .date
속성으로 이들을 모두 호출할 수 있습니다.
x='2024. 10. 11 3:30:00' type(x), x
(str, '2024. 10. 11 3:30:00')
x_pd=pd.to_datetime(x) type(x_pd), x_pd
(pandas._libs.tslibs.timestamps.Timestamp, Timestamp('2024-10-11 03:30:00'))
x_pd.year, x_pd.month, x_pd.day
(2024, 10, 11)
x1=['2024. 10. 11 3:30:00', '2024. 10. 12 3:30:00', '2024. 10. 13 3:30:00'] x1_pd=pd.to_datetime(x) type(x1_pd), x1_pd
(pandas.core.indexes.datetimes.DatetimeIndex, DatetimeIndex(['2024-10-11 03:30:00', '2024-10-12 03:30:00', '2024-10-13 03:30:00'], dtype='datetime64[ns]', freq=None))
x1.date
array([datetime.date(2024, 10, 11), datetime.date(2024, 10, 12), datetime.date(2024, 10, 13)], dtype=object)
이러한 객체의 형식을 문자형으로 변화시키기 위해 .strftime()
메소드를 적용합니다. 다음 코드에서 d, m, y는 각각 일, 월, 년을 나타냅니다. y는 연도의 축약된 형태로서 2022일 경우 22만을 표시하고 Y는 2022를 모두 나타냅니다.
x2.strftime('%d/%m/%y')
'11/10/10'
여러개로 구성된 문자열 형식의 날짜 데이터를 Date 형식으로 변환하기 위해 위의 과정에 lambda()
함수를 적용합니다.
dateD=['2010. 10. 11 오후 3:30:00', '2010. 10. 12 오후 3:30:00', '2010. 10. 13 오후 3:30:00', '2010. 10. 14 오후 3:30:00', '2010. 10. 15 오후 3:30:00', '2010. 10. 18 오후 3:30:00',] dateD
['2010. 10. 11 오후 3:30:00', '2010. 10. 12 오후 3:30:00', '2010. 10. 13 오후 3:30:00', '2010. 10. 14 오후 3:30:00', '2010. 10. 15 오후 3:30:00', '2010. 10. 18 오후 3:30:00']
dateD1=list(map(lambda x: pd.to_datetime(x.split("오")[0]).strftime('%Y.%m.%d'), dateD)) dateD1
['2010.10.11', '2010.10.12', '2010.10.13', '2010.10.14', '2010.10.15', '2010.10.18']
pd.to_datetime(dateD1)
DatetimeIndex(['2010-10-11', '2010-10-12', '2010-10-13', '2010-10-14', '2010-10-15', '2010-10-18'], dtype='datetime64[ns]', freq=None)
일일 주가자료를 주중자료로 변환
FinanceDataReader.DataReader(코드, 시작, 마지막)
함수를 사용하여 일정기간의 주가자료(kospi)를 호출합니다.
import numpy as np import pandas as pd import FinanceDataReader as fdr
st=pd.Timestamp(2010,3, 1) et=pd.Timestamp(2022, 6, 4) kos=fdr.DataReader('KS11', st, et) kos.tail(2)
Close | Open | High | Low | Volume | Change | |
---|---|---|---|---|---|---|
Date | ||||||
2022-06-02 | 2658.99 | 2670.74 | 2674.00 | 2653.59 | 525260000.0 | -0.0100 |
2022-06-03 | 2670.65 | 2679.57 | 2681.51 | 2663.00 | 562470000.0 | 0.0044 |
위 자료의 인덱스는 pandas의 DateTimeIndex입니다. 이 자료형은 pandas의 .isocalendar()
메서드에 의해 year, week, day로 분리할 수 있습니다.
idx=kos.index type(idx)
pandas.core.indexes.datetimes.DatetimeIndex
idx[:3]
DatetimeIndex(['2010-03-02', '2010-03-03', '2010-03-04'], dtype='datetime64[ns]', name='Date', freq=None)
time=idx.isocalendar() time
year | week | day | |
---|---|---|---|
Date | |||
2010-03-02 | 2010 | 9 | 2 |
2010-03-03 | 2010 | 9 | 3 |
... | ... | ... | ... |
2022-06-02 | 2022 | 22 | 4 |
2022-06-03 | 2022 | 22 | 5 |
3027 rows × 3 columns |
위 time 객체를 kos 객체와 결합합니다.
kos1=pd.concat([time, kos], axis=1) kos1.tail(2)
Date | year | week | day | Close | Open | High | Low | Volume | Change |
---|---|---|---|---|---|---|---|---|---|
2022-06-02 | 2022 | 22 | 4 | 2658.99 | 2670.74 | 2674.00 | 2653.59 | 525260000.0 | -0.0100 |
2022-06-03 | 2022 | 22 | 5 | 2670.65 | 2679.57 | 2681.51 | 2663.00 | 562470000.0 | 0.0044 |
week와 day는 순환성입니다. 그러므로 week 단위로 분류하기 위해서는 먼저 위 자료를 년단위로 먼저 구분해야 합니다. 2020년도에 해당하는 자료만을 분류해 봅니다.
kos2020=kos1.iloc[np.where(kos1['year']==2020)[0],:] kos2020.tail(2)
Date | year | week | day | Close | Open | High | Low | Volume | Change |
---|---|---|---|---|---|---|---|---|---|
2020-12-29 | 2020 | 53 | 2 | 2820.51 | 2810.55 | 2823.44 | 2792.06 | 1.050000e+09 | 0.0042 |
2020-12-30 | 2020 | 53 | 3 | 2873.47 | 2820.36 | 2878.21 | 2809.35 | 1.070000e+09 | 0.0188 |
위 객체를 pandas 라이브러리의 groupby(key)
메서드를 사용하여 week를 key로 하여 분류합니다.
list(kos2020.groupby('week'))[1]
(2,
year | week | day | Close | Open | High | Low | Volume | Change | |
---|---|---|---|---|---|---|---|---|---|
2020-01-06 | 2020 | 2 | 1 | 2155.07 | 2154.97 | 2164.42 | 2149.95 | 592670000.0 | -0.0098 |
2020-01-07 | 2020 | 2 | 2 | 2175.54 | 2166.60 | 2181.62 | 2164.27 | 568240000.0 | 0.0095 |
2020-01-08 | 2020 | 2 | 3 | 2151.31 | 2156.27 | 2162.32 | 2137.72 | 913830000.0 | -0.0111 |
2020-01-09 | 2020 | 2 | 4 | 2186.45 | 2182.20 | 2186.45 | 2172.16 | 592600000.0 | 0.0163 |
2020-01-10 | 2020 | 2 | 5 | 2206.39 | 2189.48 | 2206.92 | 2188.10 | 594540000.0 | 0.0091 |
위와 같이 분류된 각 그룹의 열평균을 계산합니다. 주단위 데이터의 구조는 의도대로 조정이 가능합니다. 또한 최종적으로 위 객체의 날짜와 관계된 열을 삭제합니다.
re=kos2020.groupby('week').mean() re.tail(2)
week | year | day | Close | Open | High | Low | Volume | Change |
---|---|---|---|---|---|---|---|---|
52 | 2020.0 | 2.5 | 2769.752500 | 2761.087500 | 2783.925000 | 2739.902500 | 1.137500e+09 | 0.003175 |
53 | 2020.0 | 2.0 | 2834.193333 | 2817.286667 | 2845.413333 | 2800.323333 | 1.043333e+09 | 0.007867 |
re=re.drop(['year', 'day'], axis=1) re.tail(2)
week | Close | Open | High | Low | Volume | Change |
---|---|---|---|---|---|---|
52 | 2769.752500 | 2761.087500 | 2783.925000 | 2739.902500 | 1.137500e+09 | 0.003175 |
53 | 2834.193333 | 2817.286667 | 2845.413333 | 2800.323333 | 1.043333e+09 | 0.007867 |
시간 데이터 수열 생성
특정한 기간의 시간 데이터 수열은 pandas.period_range(start, end, freq), pd.date_range(start, end, periods, freq)
함수에 의해 생성할 수 있습니다. 수열 생성의 규칙은 이 함수의 매개변수 freq에 의해 지정될 수 있습니다. 다음예의 'D'는 그 구간내에 모든 날짜, 'b'는 업무일을 기준으로 생성합니다.
pd.period_range(start='2022-5-31', end='2022-6-7',freq='D')
PeriodIndex(['2022-05-31', '2022-06-01', '2022-06-02', '2022-06-03', '2022-06-04', '2022-06-05', '2022-06-06', '2022-06-07'], dtype='period[D]')
d=pd.period_range(start='2022-5-31', end='2022-6-7',freq='b') d
PeriodIndex(['2022-05-31', '2022-06-01', '2022-06-02', '2022-06-03', '2022-06-06', '2022-06-07'], dtype='period[B]')
d.dayofweek
Int64Index([1, 2, 3, 4, 0, 1], dtype='int64')
d.weekday
Int64Index([1, 2, 3, 4, 0, 1], dtype='int64')
a=pd.date_range(start="2024-3-1", end="2024-3-30", periods=7) a
DatetimeIndex(['2024-03-01 00:00:00', '2024-03-05 20:00:00', '2024-03-10 16:00:00', '2024-03-15 12:00:00', '2024-03-20 08:00:00', '2024-03-25 04:00:00', '2024-03-30 00:00:00'], dtype='datetime64[ns]', freq=None)
.date
속성을 적용하여 시간 부분을 삭제하고 나타낼 수 있습니다.
a.date
array([datetime.date(2024, 3, 1), datetime.date(2024, 3, 5), datetime.date(2024, 3, 10), datetime.date(2024, 3, 15), datetime.date(2024, 3, 20), datetime.date(2024, 3, 25), datetime.date(2024, 3, 30)], dtype=object)
댓글
댓글 쓰기