Pandas 시계열 제어 (2)

stav·2024년 6월 6일
0
post-thumbnail

📝 07 시계열 제어 - 데이터 셋에서 시계열 데이터 처리(to_datetime, parse_dates=) ✏️

pd.to_datetime()

  • 정의: 문자열, 숫자, 리스트, 또는 Series 객체를 datetime으로 변환하는 함수이다.
  • 파라미터:
    • arg: 변환할 데이터.
    • errors: 에러 처리 방법 ('raise', 'coerce', 'ignore').
    • format: 날짜 형식 문자열.
    • unit: 시간 단위 (예: 's', 'ms').
  • 사용 예:
import pandas as pd

# 문자열 리스트를 datetime으로 변환
date_strings = ['2023-01-01', '2023-01-02', '2023-01-03']
dates = pd.to_datetime(date_strings)
dates
# 결과: DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', freq=None)

parse_dates

  • 정의: 데이터를 불러올 때 특정 열을 datetime 형식으로 변환하는 옵션.
  • 사용 예:
# 예제 CSV 파일 로드
df = pd.read_csv('example.csv', parse_dates=['date_column'])
df['date_column']
# 결과: datetime 형식으로 변환된 열을 포함한 데이터프레임
  • 예제: 복잡한 날짜 형식을 가진 데이터를 처리하는 방법
# 다양한 날짜 형식을 가진 데이터프레임 생성
data = {'date': ['2023-01-01', '01/02/2023', '2023.03.01', 'April 4, 2023'],
        'value': [10, 20, 30, 40]}
df = pd.DataFrame(data)

# to_datetime을 사용하여 날짜 형식 변환
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df
# 결과:
#         date  value
# 0 2023-01-01     10
# 1 2023-01-02     20
# 2 2023-03-01     30
# 3 2023-04-04     40

📝 08 시계열 제어 - 날짜 포맷 정리 ✏️

날짜 포맷 정리

  • 설명: 다양한 형식의 날짜 데이터를 정리하고 변환하는 방법.
  • 예제:
# 여러 형식의 날짜 문자열 변환
date_strings = ['01-01-2023', '2023.01.01', 'January 1, 2023']
dates = pd.to_datetime(date_strings, format='%d-%m-%Y', errors='coerce')
dates
# 결과: DatetimeIndex(['2023-01-01', '2023-01-01', '2023-01-01'], dtype='datetime64[ns]', freq=None)
  • 예제: 복잡한 날짜 형식 정리
# 다양한 날짜 형식을 가진 데이터프레임 생성
data = {'date': ['01-01-2023', '2023/02/01', 'March 3, 2023', '04.04.2023'],
        'value': [10, 20, 30, 40]}
df = pd.DataFrame(data)

# to_datetime을 사용하여 날짜 형식 변환
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df
# 결과:
#         date  value
# 0 2023-01-01     10
# 1 2023-02-01     20
# 2 2023-03-03     30
# 3 2023-04-04     40

📝 09 시계열 제어 - 잘못된 날짜 포맷 정리 ✏️

잘못된 날짜 포맷 정리

  • 설명: 잘못된 형식의 날짜 데이터를 처리하고 변환하는 방법.
  • 예제:
# 잘못된 날짜 형식의 문자열 변환
date_strings = ['2023/01/01', '01-2023-01', '20230101']
dates = pd.to_datetime(date_strings, errors='coerce')
dates
# 결과: DatetimeIndex(['2023-01-01', 'NaT', '2023-01-01'], dtype='datetime64[ns]', freq=None)
  • 예제: 잘못된 날짜 형식을 가진 데이터를 처리하는 방법
# 잘못된 날짜 형식을 가진 데이터프레임 생성
data = {'date': ['2023/01/01', '01-2023-01', '20230101', '2023.04.05'],
        'value': [10, 20, 30, 40]}
df = pd.DataFrame(data)

# to_datetime을 사용하여 날짜 형식 변환
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df
# 결과:
#         date  value
# 0 2023-01-01     10
# 1        NaT     20
# 2 2023-01-01     30
# 3 2023-04-05     40

📝 10 시계열 제어 - 시계열의 조회(.loc) ✏️

시계열 데이터의 조회

  • 설명: .loc를 사용하여 시계열 데이터를 조회하는 방법.
  • 예제:
# 예제 데이터프레임 생성
date_range = pd.date_range(start='2023-01-01', end='2023-01-10')
df = pd.DataFrame({'value': range(10)}, index=date_range)

# 특정 날짜 조회
specific_date = df.loc['2023-01-05']
specific_date
# 결과: value    4
# Name: 2023-01-05 00:00:00, dtype: int64

# 날짜 범위 조회
date_range_data = df.loc['2023-01-03':'2023-01-06']
date_range_data
# 결과:
#             value
# 2023-01-03      2
# 2023-01-04      3
# 2023-01-05      4
# 2023-01-06      5
  • 예제: 복잡한 시계열 데이터 조회
# 시계열 데이터프레임 생성
date_range = pd.date_range(start='2023-01-01', end='2023-01-15')
data = {'value': range(15)}
df = pd.DataFrame(data, index=date_range)

# 특정 날짜와 조건 조회
filtered_data = df.loc['2023-01-05':'2023-01-10'][df['value'] > 5]
filtered_data
# 결과:
#             value
# 2023-01-06      6
# 2023-01-07      7
# 2023-01-08      8
# 2023-01-09      9
# 2023-01-10     10

📝 11 시계열 제어 - 재색인(reindex)와 결측치 처리 ✏️

재색인(reindex)

  • 설명: 시계열 데이터의 인덱스를 새로 설정하거나 변경하는 방법.
  • 예제:
import pandas as pd

# 예제 데이터프레임 생성
date_range = pd.date_range(start='2023-01-01', periods=5, freq='D')
df = pd.DataFrame({'value': range(5)}, index=date_range)

# 재색인
new_date_range = pd.date_range(start='2023-01-01', periods=7, freq='D')
df_reindexed = df.reindex(new_date_range)
df_reindexed
# 결과:
#             value
# 2023-01-01    0.0
# 2023-01-02    1.0
# 2023-01-03    2.0
# 2023-01-04    3.0
# 2023-01-05    4.0
# 2023-01-06    NaN
# 2023-01-07    NaN

결측치 처리

  • 설명: 결측치(NaN)를 처리하는 방법.
  • 예제:
# 결측치 채우기
df_filled = df_reindexed.fillna(0)
df_filled
# 결과:
#             value
# 2023-01-01    0.0
# 2023-01-02    1.0
# 2023-01-03    2.0
# 2023-01-04    3.0
# 2023-01-05    4.0
# 2023-01-06    0.0
# 2023-01-07    0.0

심화 예제

  • 예제: 복잡한 재색인과 결측치 처리
# 예제 데이터프레임 생성
date_range = pd.date_range(start='2023-01-01', periods=5, freq='D')
data = {'value': [1, None, 3, None, 5]}
df = pd.DataFrame(data, index=date_range)

# 재색인 및 결측치 채우기
new_date_range = pd.date_range(start='2023-01-01', periods=7, freq='D')
df_reindexed = df.reindex(new_date_range)
df_filled = df_reindexed.fillna(method='ffill')  # 결측치를 앞의 값으로 채우기
df_filled
# 결과:
#             value
# 2023-01-01    1.0
# 2023-01-02    1.0
# 2023-01-03    3.0
# 2023-01-04    3.0
# 2023-01-05    5.0
# 2023-01-06    5.0
# 2023-01-07    5.0

📝 12 시계열 제어 - 리샘플링(resample, asfreq, interpolate, method=, kind=) ✏️

리샘플링(resample)

  • 설명: 시계열 데이터를 새로운 주기로 변환하는 방법.
  • 예제:
import pandas as pd

# 예제 데이터프레임 생성
date_range = pd.date_range(start='2023-01-01', periods=10, freq='D')
df = pd.DataFrame({'value': range(10)}, index=date_range)

# 일간 데이터를 주간 데이터로 리샘플링
df_resampled = df.resample('W').sum()
df_resampled
# 결과:
#             value
# 2023-01-01      0
# 2023-01-08     28
# 2023-01-15     17

asfreq

  • 설명: 시계열 데이터를 새로운 빈도로 변환하여 빈 값을 유지하는 방법.
  • 예제:
# 일간 데이터를 주간 빈도로 변환
df_asfreq = df.asfreq('W')
df_asfreq
# 결과:
#             value
# 2023-01-01    0.0
# 2023-01-08    7.0
# 2023-01-15    NaN

interpolate

  • 설명: 결측치를 보간하여 채우는 방법.

  • 예제:

# 결측치를 선형 보간으로 채우기
df_interpolated = df_asfreq.interpolate(method='linear')
df_interpolated
# 결과:
#             value
# 2023-01-01    0.0
# 2023-01-08    7.0
# 2023-01-15   14.0
  • 예제: 복잡한 리샘플링과 보간
# 예제 데이터프레임 생성
date_range = pd.date_range(start='2023-01-01', periods=30, freq='D')
data = {'value': [i if i % 2 == 0 else None for i in range(30)]}
df = pd.DataFrame(data, index=date_range)

# 리샘플링 및 보간
df_resampled = df.resample('W').mean()
df_interpolated = df_resampled.interpolate(method='polynomial', order=2)  # 다항식 보간
df_interpolated
# 결과:
#                  value
# 2023-01-01   0.000000
# 2023-01-08   3.500000
# 2023-01-15   9.000000
# 2023-01-22  14.500000
# 2023-01-29  20.000000
# 2023-02-05  25.500000

format에 대하여

strftime으로 변환된 데이터는 일정한 형식을 가지므로, pd.to_datetime을 사용할 때 format 인자를 사용하지 않아도 작동한다. 그러나 성능 향상과 명확성을 위해 format 인자를 사용하는 것이 좋다.

예를 들어, strftime으로 변환된 데이터가 2015.03.04 형식인 경우, pd.to_datetime을 사용할 때 format 인자를 생략할 수 있다. 그러나 명시적으로 형식을 지정하는 것이 더 좋은 방법이다.

format 인자를 사용하지 않는 경우

import pandas as pd

# 예시 데이터프레임 생성
data = {
    'value': [10, 20, 30]
}
index = pd.to_datetime(['2015-03-04', '2015-03-05', '2015-03-06'])
df = pd.DataFrame(data, index=index)

# 날짜형 데이터를 문자열로 변환
df.index = df.index.strftime('%Y.%m.%d')

# 문자열을 날짜형 데이터로 다시 변환 (format 인자 없이)
df.index = pd.to_datetime(df.index)

# 결과 확인
print(df)

format 인자를 사용하는 경우

import pandas as pd

# 예시 데이터프레임 생성
data = {
    'value': [10, 20, 30]
}
index = pd.to_datetime(['2015-03-04', '2015-03-05', '2015-03-06'])
df = pd.DataFrame(data, index=index)

# 날짜형 데이터를 문자열로 변환
df.index = df.index.strftime('%Y.%m.%d')

# 문자열을 날짜형 데이터로 다시 변환 (format 인자 사용)
df.index = pd.to_datetime(df.index, format='%Y.%m.%d')

# 결과 확인
print(df)

요약

  • format 인자를 사용하지 않는 경우:

    • pd.to_datetime은 형식을 자동으로 인식하려고 시도한다.
    • 성능이 떨어질 수 있으며, 데이터가 일정한 형식을 따르지 않는 경우 오류가 발생할 수 있다.
  • format 인자를 사용하는 경우:

    • 변환할 문자열의 형식을 명시적으로 지정하여 변환한다.
    • 성능이 향상되고, 변환 과정에서의 명확성이 높아진다.

따라서, strftime으로 변환된 일정한 형식의 문자열 데이터를 다시 날짜형 데이터로 변환할 때는 format 인자를 사용하는 것이 권장된다.

profile
Data Analyst Challenge

0개의 댓글

관련 채용 정보