본문 바로가기
빅데이터 분석기사

[빅분기 실기] 판다스 (pandas) 시계열 데이터 (datetime, Timedelta)

by 콛웅이 2024. 11. 10.

1. 시계열 데이터 (datetime)

날짜와 시간 관련 데이터는 시간의 순서에 따른 측정값, 기간 설정 등의 다양한 분석과 작업에 사용된다.

 

1-1. 날짜와 시간 데이터

일반적으로 날짜는 하이픈 (-)을 사용해 연도-월-일 형태로 만든다.

시간은 콜론 (:)을 사용해 시간:분:초 형태로 만든다.

 

다음과 같이 데이터를 생성한다.

 

import pandas as pd

data = {
  'Date1' : ['2024-02-17', '2024-02-18', '2024-02-19', '2024-02-20'],
  'Date2' : ['2024:02:17', '2024:02:18', '2024:02:19', '2024:02:20'],
  'Date3' : ['24/02/17', '24/02/18', '24/02/19', '24/02/20'],
  'Date4' : ['02/17/2024', '02/18/2024', '02/19/2024', '02/20/2024'],
  'Date5' : ['17-Feb-2024', '18-Feb-2024', '19-Feb-2024', '20-Feb-2024'],
  'DateTime1' : ['24-02-17 13:50:30', '24-02-18 14:55:45', '24-02-19 15:30:15', '24-02-20 16:10:50'],
  'DateTime2' : ['2024-02-17 13-50-30', '2024-02-18 14-55-45', '2024-02-19 15-30-15', '2024-02-20 16-10-50'],
  'DateTime3' : ['02/17/2024 01:50:30 PM', '02/18/2024 02:55:45 PM', '02/19/2024 03:30:15 AM', '02/20/2024 04:10:50 AM'],
  'DateTime4' : ['17 Feb 2024 13:50:30', '18 Feb 2024 14:55:45', '19 Feb 2024 15:30:15', '20 Feb 2024 16:10:50'],
}

 

df = pd.DataFrame(data)
df.to_csv('date_data.csv', index=False)
df

 

데이터프레임 결과

 

df.info()

 

데이터프레임 정보 확인

 

파이썬은 데이터를 불러올 때 날짜와 시간을 자동으로 인식하지 못한다.

문자열 데이터로 인식해 자료형은 object인 것을 확인할 수 있다.

 

1-2. datetime 자료형

날짜와 시간 데이터를 다루기 위해 object에서 datetime으로 자료형을 변경한다. (파싱 (parsing))

 

※ 파싱이란 문자열을 의미 있는 단위로 분해하고 구조를 식별하는 과정이다.

 

to_datetime()을 사용해 자료형을 변경한다.

대부분의 날짜와 시간 형태는 판다스가 자동으로 인식해 변경하지만, 인식하지 못하면 format 설정이 별도로 필요하다.

 

df = pd.read_csv('date_data.csv')
df['Date1'] = pd.to_datetime(df['Date1'])
df['Date2'] = pd.to_datetime(df['Date2'], format='%Y:%m:%d') # error
df['Date3'] = pd.to_datetime(df['Date3']) # error
df['Date4'] = pd.to_datetime(df['Date4'])
df['Date5'] = pd.to_datetime(df['Date5'])
df['DateTime1'] = pd.to_datetime(df['DateTime1']) # error
df['DateTime2'] = pd.to_datetime(df['DateTime2'], format='%Y-%m-%d %H-%M-%S') # error
df['DateTime3'] = pd.to_datetime(df['DateTime3']) # error
df['DateTime4'] = pd.to_datetime(df['DateTime4'])
df

 

to_datetime 적용 결과

 

Date3와 Datetime1은 에러가 발생하지 않았지만 연도, 월, 일을 잘못 인식했다.

Date2와 Datetime2는 에러가 발생해 format을 미리 설정했다.

 

1-3. 날짜와 시간 format

Date2 컬럼

콜론을 사용해 연도:월:일을 구분하고 있다.

콜론은 시간을 나타낼 때 사용하므로 판다스가 이를 인식하지 못한다.

format='%Y:%m:%d' 형태를 추가한다.

%Y 연도 4자리 (예: 2024)
%m 월 (예: 01~12)
%d 일 (예: 01~31)

 

Date3 컬럼

슬래시(/)를 사용해 연도/월/일을 구분하고 있다.

연도가 2자리라서 일/월/연도로 잘못 인식하고 있다.

format='%y/%m/%d'를 적용한다.

%y 연도 2자리 (예: 24)

 

DateTime1 컬럼

연도-월-일 시간:분:초를 구분하고 있다.

연도가 2자리라서 일-월-연도로 잘못 인식하고 있다.

format='%y-%m-%d %H:%M:%S'를 적용한다.

%H 시간 (예: 00~23)
%M 분 (예: 00~59)
%S 초 (예: 00~59)

 

DateTime2 컬럼

연도-월-일 시간-분-초를 구분하고 있다.

일반적으로 시간을 나타낼 때 하이픈(-)을 사용하지 않으면 자동으로 인식하지 못한다.

format='%Y-%m-%d %H-%M-%S'를 적용한다.

 

format을 적용한 코드와 결과는 다음과 같다.

 

df = pd.read_csv('date_data.csv')
df['Date1'] = pd.to_datetime(df['Date1'])
df['Date2'] = pd.to_datetime(df['Date2'], format='%Y:%m:%d')
df['Date3'] = pd.to_datetime(df['Date3'], format='%y/%m/%d')
df['Date4'] = pd.to_datetime(df['Date4'])
df['Date5'] = pd.to_datetime(df['Date5'])
df['DateTime1'] = pd.to_datetime(df['DateTime1'], format='%y-%m-%d %H:%M:%S')
df['DateTime2'] = pd.to_datetime(df['DateTime2'], format='%Y-%m-%d %H-%M-%S')
df['DateTime3'] = pd.to_datetime(df['DateTime3'])
df['DateTime4'] = pd.to_datetime(df['DateTime4'])
df

 

format을 적용한 결과

 

1-4. 날짜와 시간 데이터 분할 (datetime dt 속성)

판다스의 dt를 활용해 연도, 월, 일, 시간, 분, 초를 별도의 변수로 분리 생성할 수 있다.

datetime 자료형만 dt를 사용할 수 있고 object 자료형에는 사용할 수 없다.

 

df['year'] = df['DateTime1'].dt.year
df['month'] = df['DateTime1'].dt.month
df['day'] = df['DateTime1'].dt.day
df['hour'] = df['DateTime1'].dt.hour
df['minute'] = df['DateTime1'].dt.minute
df['second'] = df['DateTime1'].dt.second
df

 

날짜와 시간 데이터 분할 결과

 

1-5. 요일 찾기

dt.dayofweek를 사용하면 요일을 알 수 있다.

해당 날짜의 요일을 숫자로 변경한 값을 반환한다.

0 월요일
1 화요일
2 수요일
3 목요일
4 금요일
5 토요일
6 일요일

 

df['DateTime1'].dt.dayofweek

 

요일 숫자 결과

 

1-6. 특정 시점과 특정 구간

datetime은 특정 날짜와 시간을 나타낸다.

예를 들어, 2024-02-17 11:11:00과 같이 특정 시점을 나타낸다.

 

period는 특정 시간의 범위나 구간을 나타낸다.

예를 들어, 2024-02는 2024년 2월 전체를 나타낸다.

 

구분 코드 예시
Y(연도) dt.to_period('Y') '2024-02-17' -> '2024'
Q(분기) dt.to_period('Q') '2024-02-17' -> '2024Q1'
M(월) dt.to_period('M') '2024-02-17' -> '2024-02'
D(일) dt.to_period('D') '2024-02-17 15:30:00' -> '2024-02-17'
H(시간) dt.to_period('h') '2024-02-17 15:30:00 ' -> '2024-02-17 15:00'

 

print(df['DateTime1'].dt.to_period('Y'))
print(df['DateTime1'].dt.to_period('Q'))
print(df['DateTime1'].dt.to_period('M'))
print(df['DateTime1'].dt.to_period('D'))
print(df['DateTime1'].dt.to_period('h'))

 

특정 구간의 결과

 

2. 시계열 데이터 (Timedelta)

Timedelta는 두 시점 사이의 차이를 나타낸다.

날짜와 시간을 더하거나 빼서 새로운 시점을 계산할 수 있다.

datetime 자료형을 빼거나 더하면 결괏값으로 Timedelta 자료형이 된다.

 

데이터를 불러온다.

usecols를 활용해 DateTime4 컬럼만 선택하고, parse_dates를 사용해 datetime 자료형으로 변환했다.

 

df = pd.read_csv('date_data.csv', usecols=['DateTime4'], parse_dates = ['DateTime4'])
df

 

데이터 프레임 결과

 

2-1. 특정 시간과의 차이

예를 들어 A는 2024년 2월 17일 연애를 시작했다.

100일을 캘린더에 기록하기 위해 계산한다고 가정해 보자.

사귄 날을 1일로 하면 100일은 99일 뒤이므로 99일을 더한다.

 

df['100day'] = df['DateTime4']+pd.Timedelta(days=99)
df

 

100일 후의 날짜 계산

 

만약 100시간 뒤를 계산하고 싶다면 days를 hours로 바꾼다.

 

df['100hour'] = df['DateTime4']+pd.Timedelta(hours=99)
df

 

100시간 뒤의 날짜와 시간

 

만약 특정 시점에서 7주, 7일, 7시간, 7분, 7초 이전을 계산하고 싶다면 pd.Timedelta()로 데이터를 만들어 빼면 된다.

 

df['difference'] = df['DateTime4']-pd.Timedelta(weeks=7, days=7, hours=7, minutes=7, seconds=7)
df

 

특정 시점에서 이전 시간 계산

 

2-2. 두 시간 사이의 차이

datetime 자료형 간의 차이를 계산하면 Timedelta 자료형으로 반환된다.

 

diff = df['100hour'] - df['difference']
diff

 

두 시간의 차이 결과

 

데이터프레임에 있는 두 날짜와의 일, 시간, 분, 초를 계산해 값을 얻고 싶다면 dt.total_seconds()를 사용한다.

dt.total_seconds()를 활용하면 전체 시간을 초 단위로 변경할 수 있다.

이 값에서 60을 나누면 분이 되고, 60을 나누면 시간이 되고, 24를 나누면 일이 된다.

 

print(diff.dt.total_seconds()) # 초
print(diff.dt.total_seconds()/60) # 분
print(diff.dt.total_seconds()/60/60) # 시간
print(diff.dt.total_seconds()/60/60/24) # 일

 

두 날짜의 시간 차이 계산

 

2-3. Timedelta의 dt 속성

days는 일 수, seconds는 초를 구한다.

seconds는 총 시간에서 days를 제외한 초를 반환하는 점이 total_seconds와 다르다.

 

print(diff.dt.days)
print(diff.dt.seconds)

 

days, seconds 계산