프로그래밍/파이썬

EDA - 1단계 : 데이터 다루기 - 시간

매 석 2023. 7. 20. 19:20
반응형

- 과거내용

 

EDA - 1단계 : 데이터 다루기 - 통계(2)

과거 내용 DataFrame - 통계(2) 1. 공분산 cov를 사용해서 두 값 사이의 공분산을 구할 수 있다. min_per...

blog.naver.com

 

 

- DataFrame - 시간

 

1. 특정시간 필터링(1)

#원본 데이터
                     col1
2023-07-20 00:00:00     1
2023-07-20 03:00:00     2
2023-07-20 06:00:00     3
2023-07-20 09:00:00     4
2023-07-20 12:00:00     5
2023-07-20 15:00:00     6
2023-07-20 18:00:00     7
2023-07-20 21:00:00     8
2023-07-21 00:00:00     9
2023-07-21 03:00:00    10

#필터링
print(df.at_time('06:00'))

                     col1
2023-07-20 06:00:00     3

 

at_time을 사용해서 시간이 06:00인 것만

필터링되어 출력할 수 있게 했다.

2. 특정기간 필터링(2)

#원본 데이터
                     col1
2023-07-20 00:00:00     1
2023-07-20 03:00:00     2
2023-07-20 06:00:00     3
2023-07-20 09:00:00     4
2023-07-20 12:00:00     5
2023-07-20 15:00:00     6
2023-07-20 18:00:00     7
2023-07-20 21:00:00     8
2023-07-21 00:00:00     9
2023-07-21 03:00:00    10

#특정기간 필터링
print(df.between_time(start_time='00:00', end_time='03:00'))

                     col1
2023-07-20 00:00:00     1
2023-07-20 03:00:00     2
2023-07-21 00:00:00     9
2023-07-21 03:00:00    10

 

at_time과 다르게 between_time은 특정 구간에 속하는 데이터들을

모두 가져올 수 있다.

3. 특정기간 필터링(3)

#원본 데이터
            col1
2023-06-20     1
2023-06-23     2
2023-06-26     3
2023-06-29     4
2023-07-02     5
2023-07-05     6
2023-07-08     7
2023-07-11     8
2023-07-14     9
2023-07-17    10

#시작
print(df.first('4D'))

            col1
2023-06-20     1
2023-06-23     2

#끝
print(df.last('4D'))

            col1
2023-07-14     9
2023-07-17    10

 

first는 기준일부터 4일 범위까지를 출력하고,

last는 기준일부터 4일 전 범위까지를 출력하게 설정했다.

4D는 4개의 일이 나오는 것이 아닌 범위를 뜻한다.

4. 타임존 변경

#원본 데이터
                           us
2023-06-20 00:00:00+09:00   0
2023-06-20 02:00:00+09:00   0
2023-06-20 04:00:00+09:00   0
2023-06-20 06:00:00+09:00   0
2023-06-20 08:00:00+09:00   0

#타임존 변경
x = pd.date_range('2023-06-20',periods=5, freq='2H',tz='Asia/Seoul')
data=x.tz_convert('US/Eastern')
df=pd.DataFrame({'us':data}, index=x)
                                                 us
2023-06-20 00:00:00+09:00 2023-06-19 11:00:00-04:00
2023-06-20 02:00:00+09:00 2023-06-19 13:00:00-04:00
2023-06-20 04:00:00+09:00 2023-06-19 15:00:00-04:00
2023-06-20 06:00:00+09:00 2023-06-19 17:00:00-04:00
2023-06-20 08:00:00+09:00 2023-06-19 19:00:00-04:00

 

tz_convert를 통해 타임존을 seoul에서 eastern으로 바꾸었다.

그 결과 +09에서 -04가 된 것을 확인할 수 있다.

5. 타임존 설정

#원본 데이터
x = pd.date_range('2023-06-20 09:00',periods=5, freq='2H') 
                    us
2023-06-20 09:00:00   0
2023-06-20 11:00:00   0
2023-06-20 13:00:00   0
2023-06-20 15:00:00   0
2023-06-20 17:00:00   0

#타임존 설정
x= x.tz_localize('US/Eastern')

                           us
2023-06-20 09:00:00-04:00   0
2023-06-20 11:00:00-04:00   0
2023-06-20 13:00:00-04:00   0
2023-06-20 15:00:00-04:00   0
2023-06-20 17:00:00-04:00   0

 

원본 데이터가 타임존이 설정되어 있지 않기에 tz_convert를 사용해서

타임존을 바꿀 수가 없다. 그렇기에 tz_localize를 통해 타임존을 초기설정 해줘야 한다.

이후 tz_convert를 사용해서 타임존을 바꿀 수 있다.

6. 타임스탬프 변환

#원본 데이터
                  0
2023-07-19 00:00  0
2023-07-19 00:30  1
2023-07-19 01:00  2

#타임스탬프 변환
print(df.to_timestamp(freq="T", how='start'))

                     0
2023-07-19 00:00:00  0
2023-07-19 00:30:00  1
2023-07-19 01:00:00  2

 

to_timestampe를 사용해서 시간이 표기되는 형식을 바꾼다.

freq에 옵션을 어떻게 주느냐에 따라 시간이 표기되는 형식이 바뀐다.

7. 인덱스 나누기

#원본 데이터
                       0
2023-06-20 00:00:00  0.0
2023-06-20 00:01:00  NaN
2023-06-20 00:02:00  2.0

#인덱스 나누기
print(df.asfreq(freq='30S',method='bfill'))
                       0
2023-06-20 00:00:00  0.0
2023-06-20 00:00:30  NaN
2023-06-20 00:01:00  NaN
2023-06-20 00:01:30  2.0
2023-06-20 00:02:00  2.0

 

asfreq를 통해서 인덱스를 나눌 수 있다.

30초 단위로 추가로 나누고, 빈 값은 bfill 형태로 채워넣는다.

8. 리샘플링

#원본 데이터
                     0
2023-06-20 00:00:00  0
2023-06-20 00:01:00  1
2023-06-20 00:02:00  2
2023-06-20 00:03:00  3
2023-06-20 00:04:00  4
2023-06-20 00:05:00  5
2023-06-20 00:06:00  6
2023-06-20 00:07:00  7
2023-06-20 00:08:00  8
2023-06-20 00:09:00  9

#리샘플링
print(df.resample(rule='3T',label='left').sum())

                      0
2023-06-20 00:00:00   3
2023-06-20 00:03:00  12
2023-06-20 00:06:00  21
2023-06-20 00:09:00   9

 

resample을 통해 리샘플링한다. rule은 리샘플링할 기준을 말한다.

위는 3분을 기준으로 했다. label은 첫번째 값이 어떤 것을 오게할 것인지 선택할 수 있다.

이외에도 closed, kind, offset, on, origin 등의 옵션이 있다.

9. 옮기기

#원본 데이터
            col1  col2
2023-06-20     0     0
2023-06-21     1     0
2023-06-22     2     0
2023-06-23     3     0
2023-06-24     4     0

#옮기기
print(df.shift(periods=1,axis=1))

            col1  col2
2023-06-20   NaN     0
2023-06-21   NaN     1
2023-06-22   NaN     2
2023-06-23   NaN     3
2023-06-24   NaN     4

 

shift를 사용해 행 또는 열로 이동시킬 수 있다.

위의 경우는 1칸을 오른쪽으로 민 경우이다.

10. period 변환

#원본 데이터
x = pd.date_range('2023-06-20',periods=5, freq='D')
            col1  col2
2023-06-20     0     0
2023-06-21     1     0
2023-06-22     2     0
2023-06-23     3     0
2023-06-24     4     0

#period 변환
print(x.to_period("D"))
PeriodIndex(['2023-06-20', '2023-06-21', '2023-06-22', '2023-06-23',
             '2023-06-24'],
            dtype='period[D]')

 

to_period를 통해서 period로 변환한다.

년, 월, 일 등 다양한 형식으로 변환하여 원하는 간격으로 출력할 수 있다.