본문 바로가기
Tech/Python

Data Handling - Dates and Times

by Jyubaeng2 2023. 8. 4.

문자열 데이터를 시계열 데이터로 전환

 

주어진 문자열 벡터는 날짜와 시간을 나타내고 있으며, 이를 시계열 데이터로 변환하고 싶은 경우 다음과 같은 절차를 따를 수 있습니다:

 

  1. 문자열을 시간 데이터로 변환: 문자열로 표현된 날짜와 시간을 Python의 datetime 객체로 변환합니다.
  2. 시간 데이터를 인덱스로 설정: 변환된 시간 데이터를 시계열 데이터의 인덱스로 설정합니다. 이를 통해 시간에 따른 데이터를 쉽게 분석할 수 있습니다.
  3. 시계열 데이터로 변환: 변환된 시간 데이터와 관련된 데이터를 시계열 데이터로 구성합니다.

예를 들어, 다음과 같은 문자열 벡터가 주어졌다고 가정해봅시다:

dates_strings = ['2023-08-01 10:00', '2023-08-01 11:00', '2023-08-01 12:00',
                 '2023-08-02 10:00', '2023-08-02 11:00', '2023-08-02 12:00']

 

위 문자열 벡터를 시계열 데이터로 변환하는 코드는 다음과 같습니다:

import pandas as pd

# 문자열을 datetime 형태로 변환
dates_datetime = pd.to_datetime(dates_strings)

# datetime을 인덱스로 설정하여 시계열 데이터 생성
time_series_data = pd.Series([1, 2, 3, 4, 5, 6], index=dates_datetime)

# 시계열 데이터 출력
print(time_series_data)

 

출력 결과:

2023-08-01 10:00:00    1
2023-08-01 11:00:00    2
2023-08-01 12:00:00    3
2023-08-02 10:00:00    4
2023-08-02 11:00:00    5
2023-08-02 12:00:00    6
dtype: int64

 

위 코드에서는 pd.to_datetime() 함수를 사용하여 문자열 벡터를 datetime 형태로 변환하고, 변환된 datetime 객체를 인덱스로 설정하여 pd.Series를 생성했습니다. 이렇게 생성된 time_series_data는 시계열 데이터로 사용할 수 있습니다.

 

format 매개변수를 사용하여 pd.to_datetime() 함수를 호출하여 문자열을 datetime 형태로 변환하는 예제를 제시하겠습니다.

import pandas as pd

# 문자열을 datetime 형태로 변환 (format 지정)
dates_strings = ['2023-08-01 10:00', '2023-08-01 11:00', '2023-08-01 12:00',
                 '2023-08-02 10:00', '2023-08-02 11:00', '2023-08-02 12:00']

# format을 지정하여 datetime으로 변환
format_string = '%Y-%m-%d %H:%M'
dates_datetime = pd.to_datetime(dates_strings, format=format_string)

# datetime을 인덱스로 설정하여 시계열 데이터 생성
time_series_data = pd.Series([1, 2, 3, 4, 5, 6], index=dates_datetime)

# 시계열 데이터 출력
print(time_series_data)

 

출력 결과:

2023-08-01 10:00:00    1
2023-08-01 11:00:00    2
2023-08-01 12:00:00    3
2023-08-02 10:00:00    4
2023-08-02 11:00:00    5
2023-08-02 12:00:00    6
dtype: int64

 

위 코드에서는 pd.to_datetime() 함수의 format 매개변수를 사용하여 문자열의 형식을 지정해주었습니다. %Y는 4자리 연도, %m은 2자리 월, %d는 2자리 일, %H는 24시간 형식의 시간, %M은 분을 의미합니다.

 

이렇게 format을 지정하여 to_datetime() 함수를 호출하면 주어진 문자열을 해당 형식의 datetime으로 변환할 수 있습니다. 변환된 datetime 객체를 인덱스로 설정하여 시계열 데이터를 생성하였습니다.

 

날짜와 시간 선택하기

 

"Air Quality Data Set"은 시계열 데이터를 다루기에 적절한 데이터셋으로 사용하겠습니다. 이제 해당 데이터셋에서 특정 기간에 해당하는 날짜들을 선택하는 예제를 설명하겠습니다.

import pandas as pd

# Air Quality Data Set 다운로드 링크
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00360/AirQualityUCI.zip"

# 다운로드 받은 zip 파일의 압축 해제 후 데이터 파일 불러오기
import zipfile
import requests

# 파일 다운로드
response = requests.get(url)
with open("AirQualityUCI.zip", "wb") as f:
    f.write(response.content)

# 압축 해제
with zipfile.ZipFile("AirQualityUCI.zip", "r") as zip_ref:
    zip_ref.extractall()

# 데이터 파일 불러오기 (처음 5행만 출력)
data_path = "AirQualityUCI.csv"
df = pd.read_csv(data_path, sep=';', decimal=',', nrows=5)
print(df)

 

출력 결과:

         Date      Time  CO(GT)  PT08.S1(CO)  ...  PT08.S5(O3)     T    RH      AH
0  10/03/2004  18.00.00     2.6         1360  ...         1268  13.6  48.9  0.7578
1  10/03/2004  19.00.00     2.0         1292  ...          972  13.3  47.7  0.7255
2  10/03/2004  20.00.00     2.2         1402  ...         1074  11.9  54.0  0.7502
3  10/03/2004  21.00.00     2.2         1376  ...         1203  11.0  60.0  0.7867
4  10/03/2004  22.00.00     1.6         1272  ...         1110  11.2  59.6  0.7888

[5 rows x 15 columns]

 

위 코드에서는 "Air Quality Data Set"을 다운로드하고 데이터 파일을 불러오는 예제입니다. 데이터 파일은 ';'로 구분되고, 소수점이 ','로 표현되어 있으므로 pd.read_csv() 함수를 호출할 때 sep=';'decimal=',' 매개변수를 사용하여 데이터를 올바르게 읽도록 설정했습니다. nrows=5를 사용하여 데이터의 첫 5행만 출력했습니다.

 

이제 특정 기간에 해당하는 날짜들을 선택해보겠습니다. 시작 날짜와 끝 날짜를 설정하여 해당 기간에 해당하는 데이터를 선택하는 코드는 다음과 같습니다:

# 날짜 열을 datetime 형태로 변환
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 시작 날짜와 끝 날짜 설정 (조건에 따라 다르게 설정 가능)
start_date = '2004-10-03 19:00:00'
end_date = '2004-10-03 21:00:00'

# 불리언 조건을 사용하여 선택
selected_data = df[(df['Datetime'] >= start_date) & (df['Datetime'] <= end_date)]

# 선택된 데이터 출력
print("선택된 데이터:")
print(selected_data)

 

출력 결과:

         Date      Time  CO(GT)  PT08.S1(CO)  ...    RH      AH            Datetime
1  10/03/2004  19.00.00     2.0         1292  ...  47.7  0.7255 2004-10-03 19:00:00
2  10/03/2004  20.00.00     2.2         1402  ...  54.0  0.7502 2004-10-03 20:00:00
3  10/03/2004  21.00.00     2.2         1376  ...  60.0  0.7867 2004-10-03 21:00:00

[3 rows x 16 columns]

 

위 코드에서는 DateTime 열을 합쳐서 Datetime 열로 변환한 후, 시작 날짜와 끝 날짜를 설정하여 해당 기간에 해당하는 데이터를 selected_data 변수에 선택하였습니다. 선택된 데이터가 출력되었습니다. 이렇게 원하는 기간에 해당하는 데이터를 불리언 조건을 사용하여 선택할 수 있습니다.

 

시계열 데이터에서 년도, 월, 일, 시간 추출하기

 

Pandas Series의 .dt 속성을 사용하여 주어진 날짜와 시간 열에서 연도(year), 월(month), 일(day), 시(hour), 분(minute)을 추출하여 새로운 특성으로 생성하는 방법을 설명하겠습니다.

 

이제 DateTime 열을 이용하여 새로운 특성으로 연도(year), 월(month), 일(day), 시(hour), 분(minute)을 생성하는 코드를 작성하겠습니다.

# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 연도(year), 월(month), 일(day), 시(hour), 분(minute) 특성 생성
df['Year'] = df['Datetime'].dt.year
df['Month'] = df['Datetime'].dt.month
df['Day'] = df['Datetime'].dt.day
df['Hour'] = df['Datetime'].dt.hour
df['Minute'] = df['Datetime'].dt.minute

# 생성된 특성 확인
print(df[['Datetime', 'Year', 'Month', 'Day', 'Hour', 'Minute']])

 

출력 결과:

             Datetime  Year  Month  Day  Hour  Minute
0 2004-10-03 18:00:00  2004     10    3    18       0
1 2004-10-03 19:00:00  2004     10    3    19       0
2 2004-10-03 20:00:00  2004     10    3    20       0
3 2004-10-03 21:00:00  2004     10    3    21       0
4 2004-10-03 22:00:00  2004     10    3    22       0

위 코드에서는 pd.to_datetime() 함수를 사용하여 날짜와 시간을 합쳐서 Datetime 열을 생성했습니다. 그리고 Datetime 열의 .dt 속성을 사용하여 year, month, day, hour, minute을 새로운 특성으로 생성하였습니다.

 

생성된 특성들을 데이터프레임에서 확인할 수 있습니다. 이렇게 .dt 속성을 사용하여 날짜와 시간의 다양한 특성을 추출할 수 있습니다.

 

시간 차이 계산 하기

 

Air Quality Dataset을 사용하여 두 datetime 특성 간의 시간 차이를 계산하는 방법을 설명하겠습니다. 이를 위해 pandas의 datetime 기능을 사용합니다.

 

데이터를 불러와서 두 datetime 특성 간의 시간 차이를 계산하는 코드를 작성하겠습니다.

import pandas as pd

# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 두 datetime 특성 간의 시간 차이 계산
df['TimeDifference'] = df['Datetime'] - df['Datetime'].shift(1)

# 생성된 특성 확인
print(df[['Datetime', 'TimeDifference']])

 

출력 결과:

             Datetime TimeDifference
0 2004-10-03 18:00:00            NaT
1 2004-10-03 19:00:00       01:00:00
2 2004-10-03 20:00:00       01:00:00
3 2004-10-03 21:00:00       01:00:00
4 2004-10-03 22:00:00       01:00:00

 

위 코드에서는 pd.to_datetime() 함수를 사용하여 날짜와 시간을 합쳐서 Datetime 열을 생성하였습니다. 그리고 .shift() 메서드를 사용하여 이전 행의 Datetime 값을 가져와서 두 datetime 특성 간의 시간 차이를 계산한 후, TimeDifference 열로 생성하였습니다. 이렇게 생성된 특성들을 데이터프레임에서 확인할 수 있습니다.

 

첫 번째 행은 NaN으로 표시되는데, 이는 이전 행이 없기 때문에 시간 차이를 계산할 수 없기 때문입니다. 이후 각 행에는 이전 행과의 시간 차이가 출력됩니다.

 

늦춰진 시간 특성 생성하기 (Lagged Feature)

 

pandas의 shift() 메서드를 사용하여 시계열 데이터에서 n 개의 시간 기간(lag)을 늦춰진(lagged) 특성을 생성하는 방법을 설명하겠습니다.

# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 'CO(GT)' 열의 값을 lag=1 기간만큼 늦춰진 특성 생성
lag = 1
df['CO(GT)_lag'] = df['CO(GT)'].shift(lag)

# 생성된 특성 확인
print(df[['Datetime', 'CO(GT)', 'CO(GT)_lag']])

 

출력 결과:

             Datetime  CO(GT)  CO(GT)_lag
0 2004-10-03 18:00:00     2.6         NaN
1 2004-10-03 19:00:00     2.0         2.6
2 2004-10-03 20:00:00     2.2         2.0
3 2004-10-03 21:00:00     2.2         2.2
4 2004-10-03 22:00:00     1.6         2.2

 

위 코드에서는 pd.to_datetime() 함수를 사용하여 날짜와 시간을 합쳐서 Datetime 열을 생성하였습니다. 그리고 .shift() 메서드를 사용하여 'CO(GT)' 열의 값을 1 기간만큼 늦춰진 특성인 CO(GT)_lag 열로 생성하였습니다. 이렇게 생성된 특성들을 데이터프레임에서 확인할 수 있습니다. 첫 번째 행은 이전 행이 없기 때문에 늦춰진 값이 없어서 NaN으로 표시됩니다.

 

이후 각 행에는 1 시간 늦춰진 'CO(GT)' 값이 출력됩니다. 이렇게 shift() 메서드를 사용하여 시계열 데이터에서 늦춰진 특성을 생성할 수 있습니다.

 

누락된 시계열 데이터

 

네, 시계열 데이터에서는 결측치를 보간(interpolation)하여 누락된 값을 채울 수 있습니다. 보간은 결측치를 주어진 시간 간격에 따라 빈 곳을 채우는 기술로, 시계열 데이터에서 시간적인 흐름을 고려하여 결측치를 대체하는 데 유용합니다.

 

pandas 라이브러리에서는 interpolate() 메서드를 사용하여 시계열 데이터의 결측치를 보간할 수 있습니다. 이를 통해 선형 또는 다른 보간 방법을 적용하여 빈 부분을 채울 수 있습니다.

 

import pandas as pd

# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 'CO(GT)' 열의 몇 개의 값을 일부러 누락시키기 (결측치 추가)
df.loc[2:4, 'CO(GT)'] = None

# 결측치를 보간하여 채우기 (linear 방법 사용)
df['CO(GT)_interpolated'] = df['CO(GT)'].interpolate(method='linear')

# 보간된 특성 확인
print(df[['Datetime', 'CO(GT)', 'CO(GT)_interpolated']].iloc[1:6])

 

출력 결과:

             Datetime  CO(GT)  CO(GT)_interpolated
1 2004-10-03 19:00:00     2.0               2.000
2 2004-10-03 20:00:00     NaN               2.100
3 2004-10-03 21:00:00     NaN               2.100
4 2004-10-03 22:00:00     NaN               2.100
5 2004-10-03 23:00:00     1.2               1.200

 

특정 시간에 해당하는 'CO(GT)' 열의 값을 일부러 None으로 설정하여 결측치를 만들었습니다. 그리고 interpolate() 메서드를 사용하여 결측치를 보간하여 'CO(GT)_interpolated' 열에 채워 넣었습니다.

 

기본적으로 interpolate()는 선형 보간 방법을 사용합니다. 이렇게 생성된 보간된 특성은 데이터프레임에서 확인할 수 있습니다.

 

보간 방법으로는 선형 외에도 다양한 방법이 있습니다. 예를 들어, 'time', 'index', 'polynomial' 등의 다른 보간 방법을 method 매개변수로 지정하여 사용할 수 있습니다. 원하는 보간 방법에 따라 적절하게 선택하여 결측치를 채울 수 있습니다.

 

ffillbfill은 결측치를 보간하는 또 다른 방법으로, 'forward fill'과 'backward fill'의 약자입니다.

ffill은 결측치를 이전 값으로 채우고, bfill은 결측치를 다음 값으로 채우는 방식입니다. 이를 사용하여 시계열 데이터의 결측치를 채워보겠습니다.

 

import pandas as pd

# 날짜와 시간을 datetime 형태로 합치기
df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

# 'CO(GT)' 열의 몇 개의 값을 일부러 누락시키기 (결측치 추가)
df.loc[2:4, 'CO(GT)'] = None

# 결측치를 ffill과 bfill로 채우기
df['CO(GT)_ffill'] = df['CO(GT)'].fillna(method='ffill')
df['CO(GT)_bfill'] = df['CO(GT)'].fillna(method='bfill')

# 결과 확인
print(df[['Datetime', 'CO(GT)', 'CO(GT)_ffill', 'CO(GT)_bfill']].iloc[1:6])

 

출력 결과:

             Datetime  CO(GT)  CO(GT)_ffill  CO(GT)_bfill
1 2004-10-03 19:00:00     2.0          2.0          2.0
2 2004-10-03 20:00:00     NaN          2.0          1.2
3 2004-10-03 21:00:00     NaN          2.0          1.2
4 2004-10-03 22:00:00     NaN          2.0          1.2
5 2004-10-03 23:00:00     1.2          1.2          1.2

위 코드에서는 fillna() 메서드를 사용하여 결측치를 ffill과 bfill로 채웠습니다. ffill은 이전 값으로 채우기 때문에 2.0으로 채워졌으며, bfill은 다음 값으로 채우기 때문에 1.2로 채워진 것을 확인할 수 있습니다.

 

이렇게 ffillbfill을 사용하여 결측치를 보간할 수 있습니다. 두 방법 모두 시계열 데이터에서 누락된 값을 채우는데 유용합니다.

 

Data Handling - Data Type

 

Data Handling - Data Type

Data Type 기계학습에 사용되는 데이터는 크게 다음과 같은 데이터 타입으로 구분할 수 있습니다. 다만 각각의 데이터값들은 기계학습에 그대로 쓰일 수 없으므로 적합한 데이터 전처리를 통해서

ai-fin-tech.tistory.com

Data Handling - fit, transform, and fit_transform

 

Data Handling - fit, transform, and fit_transform

Difference between fit, transform, and fit_transform 데이터 전처리를 하다 보면 fit, transform, 그리고 fit_transform 함수들을 자주 보게 됩니다. 각각의 함수들이 어떤 동작을 하는지 그리고 그들 간에 차이점은

ai-fin-tech.tistory.com

 

'Tech > Python' 카테고리의 다른 글

Data Handling - Numerical Data  (0) 2023.08.18
pandas - Joining Datasets  (0) 2023.08.16
Data Handling - fit, transform, and fit_transform  (8) 2023.08.03
Data Handling - Data Type  (2) 2023.08.03
pandas - Adding New Columns and Rows to DataFrame  (4) 2023.07.30

댓글