파이썬 글자 타입을 시간 타입으로 전환하기

현재 진행하고 있는 과제 중에서 해결해야 할 문제가 있습니다.

DataFrame1 ~ 4 까지 있다고 할까요?

이 모든 데이터프레임이 다 시계열 데이터입니다.

이 시계열 데이터들을 하나로 합본하고 싶은데…

DataFrame1 이 끊기고 한 10초? 정도 있다가 다시 DataFrame2가 기록되고, 또 6초? 정도 있다가 다시 DataFrame3가 기록된 것이더군요.

이렇게 되면 합본하기 좀 짜증이 납니다.

왜냐하면 일정한 hz으로 기록이 된 데이터프레임이기 때문이죠.

거기다가 분명히 적힌 거는 시간인데, 시간 타입으로 알아서 읽히지 않는 문제가 발생합니다!

해결 방법 탐색

				
					import pandas as pd

# 예시 문자열 날짜
date_str = "2021-12-22 02:26:45"
date = pd.to_datetime(date_str)
print(date)

				
			

우선은 아주 간단한 해결 방법입니다.

이 경우 str로 지정된 값을 그냥 자동으로 읽어서 시간으로 변경을 하는 건데요.

문제가 있다면 아주 거지 같은 방식으로 날짜 시간이 저장된 경우 이것을 자동으로 받아들이지 못하는 문제가 있습니다. 

				
					date = pd.to_datetime(date_str, format="%Y-%m-%d %H:%M:%S")

				
			

이러한 경우는 다음과 같이 format 을 지정하는 방식이 있습니다.

아주 거지 같이 날짜 시간을 넣었다고 가정을 해볼까요?

				
					import pandas as pd

# 예시 문자열 날짜 데이터
date_str = "45초 26분 2021년 12월 22일"

# 문자열을 datetime 형식으로 변환
date = pd.to_datetime(date_str, format="%S초 %M분 %Y년 %m월 %d일")

print("문자열 날짜:", date_str)
print("datetime 형식:", date)

				
			

이런 듣도 보도 못한 방식으로 한글과 섞어서 저장된 데이터도 

위와 같은 방법을 통해서 해결이 가능합니다. 

첫 번째 방법을 썼는데 안 되면, 두 번째 방법을 통해서 노가다 지정을 하는 것이죠. 

시간의 차이 구하기

이렇게 시간으로 타입을 변경하면 각 시간의 차이를 구하기가 쉽습니다. 

예시를 들어볼까요?

				
					 dif =  pd.to_datetime(StartTime) - pd.to_datetime(checkTime)
				
			

이건 제가 가지고 있는 데이터를 통해서 실제로 수행을 해본 코드입니다.

시간들의 형식은 2021-12-22 02:47:59.261000 이런 식으로 되어 있습니다. 

결과는…

-1 days +23:59:59.450000

이렇게 나옵니다.

뭔가 좀 복잡하죠? 계산에 바로 써먹을 수도 없고, 직관적이지 못합니다. 

				
					dif = abs(pd.to_datetime(StartTime) - pd.to_datetime(checkTime))
				
			

때문에 앞에 abs() 으로 값을 감쌌습니다.

이렇게 되면 심플하게 두 시간의 간격을 알 수가 있지요.

0 days 00:00:00.550000

이런 식으로 직관적으로 보입니다.

아~ 두 시간의 차이는 0.55 초구나.. 할 수 있는 거지요. 

				
					dif = (pd.to_datetime(StartTime) - pd.to_datetime(checkTime)).total_seconds()
				
			

더 직관적으로 하기 위해서 이번에는 뒤에 .total_seconds() 를 붙여봤습니다.

이렇게 하면 초 단위로만 딱 나와서 편합니다.

결과는…

-0.55

이렇게 나타납니다. 

마치며...

시계열 데이터를 다룰 때 골치 아프지 않으시기를 바라며..

포스팅을 마치겠습니다.