본문 바로가기
파이썬(Python)

[파이썬/Python] 날짜지만 소수점인 데이터 날짜로 변경해보기(10월이 1월로 변경되지 않도록 하기)

by Serendipity_ 2022. 11. 15.
반응형

간단하지만 은근히 속썩이는 데이터 유형에 대해 다뤄보겠습니다.

현업에서 데이터에 저장된 날짜 형태로는 2022-01, 2022-02, ... 2022-12 등의 형태로 연 월이 저장되기도 하지만, 2022.01, 2022.02 ~ 2022.12 이런 형태로 날짜를 저장하기도 합니다.

 

하이픈으로 연결된 경우, 엑셀에서 데이터 유형을 날짜로 인식하려고 노력하지만, 2022.01과 같은 경우에는 Python은 특히나 더욱더 소수점으로 생각합니다.

 

2022.01을 2022년 1월로 읽지 않고, 2022.01를 이천이십이점공일 정도로 소수점으로 생각하여 읽습니다.

특히 2022.10 으로 되어 있는 데이터의 경우, 문자열로 변경 시 2022.1로 바뀌면서 2022.01과 굉장히 혼동되기 쉽게 바뀌는데요. 

 

이를 해결하기 위해 어떤 형태로 파이썬 함수를 짜야하는 지 알아보겠습니다. 

 

먼저 데이터를 준비해줍니다.

데이터는 2022년 1월 ~ 12월까지 작성하였습니다.

import pandas as pd

df = pd.DataFrame(
    {'달력연도/월' : [2022.01, 2022.02, 2022.03, 2022.04, 2022.05,\
                 2022.06, 2022.07, 2022.08, 2022.09, 2022.10, 2022.11, 2022.12]})

df

 

월별_데이터
월별 데이터

문제는 바로 2022.10 부분이라 강조하였습니다.

 

현재 데이터 타입을 보겠습니다. 

데이터유형_확인
데이터유형 확인

float형태입니다.

Python에서 float은 소수점을 포함하는 숫자 입니다.

2022.01은 숫자가 아니라 날짜 데이터로 변경하고 싶기 때문에 문자로 먼저 변경해주어야 합니다. 

 

문자열 데이터로 변경해주고자 합니다.

astype(str)로 변경해주었더니 object(문자열 형태)로 잘 변경되긴 하였으나, 10월이 1로 바뀌어 1월과 대단히 헷갈리게 변경되었습니다.

문자열변경_10월이_1월처럼_보임
문자열로 변경하였으나 10월이 1월처럼 보임

 

해결책 - 문자열 다루기 응용

zfill, ljust, rjust 등으로 변경가능합니다.

먼저 위의 함수에 대해 간단히 알아보겠습니다.

 

test = 'python'

print('zfill의 경우 : ', test.zfill(10))
print('ljust의 경우 : ', test.ljust(10, '0'))
print('rjust의 경우 : ', test.rjust(10, '0'))
print('center의 경우 : ', test.center(10, '0'))

 

[결과물]

zfill, ljust, rjust 함수
zfill, ljust, rjust 함수

python이라는 6글자 데이터에 대해서 

zfill, rjust, ljust, center를 통해 빈칸을 채울 수 있습니다.

 

결과를 확인할 경우, test.zfill(10)은 python이라는 글자가 6갠데, 4개를 더 채워줘 이런 뜻입니다.

 

ljust의 경우, l이 'left'(왼쪽)입니다. python이라는 글자 왼쪽으로 정렬하라는 뜻입니다. 그래서 ljust의 경우, python이라는 글자를 왼쪽으로 정렬하는데 10 : 10개 칸이 있으니 남은 4칸은 '0'(문자열 0)으로 채워달라는 뜻입니다.

때문에 'python'.ljust(10, '0') 의 결과는 p y t h o n 0 0 0 0 으로 나타나게 됩니다. 

 

rjust는 r이 'right' 오른쪽이라는 뜻이며 ljust와 반대입니다.

총 10칸에서 python이라는 글자를 오른쪽으로 정렬하고 나머지 칸은 0 으로 채워달라는 뜻입니다.

0 0 0 0 p y t h o n (여기서 0은 문자열 0 입니다.)

 

ljust 상세 설명
ljust 상세 설명

 

최종 결과물

그럼 이제 돌아가서 2022.10을 표현하기 위해서 어떻게 해야하는지 보겠습니다. 

df['달력연도/월'].astype(str).apply(lambda x : x.ljust(7, '0'))

ljust를 활용한 10월 제대로 표현
ljust를 활용한 10월 제대로 표현

 

ljust 함수를 활용하여 10월달 object임에도 2022.10으로 변경할 수 있었습니다.

 

그럼 이제 마지막으로 날짜 데이터 바꾸는 방법은 pd.to_datetime을 사용하면 될 것 같습니다.

to_datetime
to_datetime

 

사소하지만 현업에서 꼭 필요한 내용으로 정리하였습니다.

많이 활용하시길 바랍니다.

반응형

댓글