Python의 pandas 라이브러리를 사용하여 서로 다른 날짜 포맷을 가진 데이터를 효율적으로 병합하는 방법을 배웁니다. 이 글에서는 날짜 포맷을 통일하는 함수 생성부터 병합까지의 과정을 단계별로 설명합니다.

주요내용

  • 📅 서로 다른 날짜 포맷을 가진 데이터를 효과적으로 병합하는 방법
  • 🛠️ apply 함수를 사용하여 날짜 포맷을 통일하는 커스텀 함수 적용 방법
  • 🔄 merge 함수로 데이터프레임 병합 및 결과 확인 방법

이 코드는 ospandas 라이브러리를 임포트하고, Python에서 발생할 수 있는 불필요한 경고 메시지를 필터링하여 표시하지 않도록 설정합니다. 또한, 현재 작업 중인 디렉토리의 경로를 얻어와서 이를 파일 로드 경로로 설정합니다. 이를 통해 사용자는 현재 작업 중인 디렉토리 내의 파일을 쉽게 접근하고 사용할 수 있습니다. warnings.filterwarnings(action = 'ignore')를 사용하여 경고 메시지를 무시함으로써, 코드 실행 시 발생할 수 있는 불필요한 경고로 인한 혼란을 방지합니다.

1
2
3
4
5
6
7
8
9
import os
import pandas as pd

# 불필요한 경고 표시를 생략합니다.
import warnings
warnings.filterwarnings(action = 'ignore')

a=%pwd # 현재 작업 경로를 변수 a에 할당합니다.
os.chdir(a) # 현재 작업 경로로 파일 로드 경로를 설정합니다.
  • 시간과 날짜 컬럼 등은 데이터에 따라 포맷이 다른 경우가 많습니다.

  • 이때 단순하게 merge를 적용하면 결과는 나오지만, 비정상적인 병합이 될 수도 있습니다.

  • 따라서, 하나의 날짜/시간 컬럼을 다른 하나의 컬럼과 동일한 포맷으로 변경해주어야 합니다.

단계별로 생각해 봅시다.

관련 문법 : Series.apply


  • Series에 있는 모든 요소에 func를 일괄 적용하는 함수 (map 함수와 유사하다)

  • apply 함수는 머신러닝 코드의 효율성 증가에 매우 유용한 함수이다.

주요 파라미터

  • func : Series의 한 요소를 처리하는 함수

image

두 개의 데이터프레임 df1df2를 생성하며, 각각 다른 날짜 형식을 가진 CSV 파일에서 데이터를 읽어옵니다. df1YYYY-MM-DD 형식의 날짜 데이터를 포함하고, df2YYYY년 MM월 DD일 형식의 날짜 데이터를 포함합니다. 이는 다양한 날짜 형식을 처리해야 할 때 유용한 방법을 제시합니다.

1
2
df1 = pd.read_csv("날짜포맷이다른데이터1.csv") # YYYY-MM-DD 형태
df2 = pd.read_csv("날짜포맷이다른데이터2.csv") # YYYY년 MM월 DD일 형태

df1.head() 함수는 데이터프레임 df1에서 상위 5개 행을 반환합니다. 이 함수는 데이터의 구조를 빠르게 파악하고자 할 때 유용하게 사용됩니다.

1
df1.head()  # 데이터프레임 df1의 상위 5개 행을 출력합니다.

df2.head() 함수는 데이터프레임에서 처음 5개의 행을 반환합니다. 이 함수는 데이터의 구조를 빠르게 파악하고자 할 때 유용하게 사용됩니다.

1
df2.head()  # 데이터프레임의 처음 5개 행을 보여줍니다.

서로 다른 포맷의 데이터여서 merge를 해도 빈칸으로 결합이 되기는 한다.

데이터프레임 df1df2'날짜' 열을 기준으로 병합하는 방법을 보여줍니다. pd.merge 함수는 지정된 열('날짜')을 기준으로 두 데이터프레임을 병합합니다.

1
2
# 두 데이터프레임을 '날짜'를 기준으로 병합합니다.
merged_df1 = pd.merge(df1, df2, on='날짜')

두 데이터프레임 df1df2'날짜' 열을 기준으로 병합하는 과정을 수행합니다. 이는 pandas 라이브러리의 merge 함수를 사용하여, 두 데이터프레임에서 동일한 '날짜' 값을 가진 행들을 결합하여 새로운 데이터프레임 merged_df2를 생성합니다.

1
merged_df2 = df1.merge(df2, on='날짜')  # df1과 df2를 '날짜'를 기준으로 병합합니다.
1
1

하지만 제대로 된 병합이 되지 않습니다.

따라서, 둘 중 하나의 형식으로 날짜 데이터의 포맷을 바꿔줄 필요가 있습니다.(포맷 통일)

  • df1의 날짜에서 ‘-‘를 기준으로 분할한 뒤에 각각의 분할된 데이터에 ‘년’, ‘월’, ‘일’을 붙여주는 방식으로 포맷 통일을 진행

날짜 포맷 변경 함수 생성


  • df1의 날짜 타입을 df2의 날짜 타입으로 변경하는 함수 작성 및 적용

  • apply() 함수에 적용시킬 것이기 때문에 각 요소에 모두 적용이 가능하도록 작성되어야 한다.

  • value: -으로 연결된 날짜 포맷의 값들


  • MM에만 str(int(MM))를 두른 이유:

    • df1의 MM부분은 1자리수의 월의 경우 앞에 0이 붙어 있다. (01, 02, 03 등)

    • 이를 df2의 형식과 일치 시키기 위해 int형으로 먼저 변경해서 0을 제거한 뒤 문자형(str)로 변경해서 ‘월’과 붙여주는 것

  • 주의 사항: 2018년 뒤에 공백이 1칸 있다. 그래서 “년”이 아니고 “년 “이다. (월도 마찬가지)

함수 date_type_converter는 하이픈(-)으로 구분된 날짜 문자열을 입력받아, 해당 문자열을 YYYY년 MM월 DD일 형식으로 변환하여 반환합니다. 이 함수는 문자열을 분리하고, 월과 일을 정수로 변환한 후 다시 문자열로 포매팅하는 과정을 포함합니다.

1
2
3
4
def date_type_converter(value):
    # 입력된 날짜 문자열을 '년', '월', '일'로 변환합니다.
    YYYY, MM, DD = value.split('-')
    return YYYY + "년 " + str(int(MM)) + "월 " + str(int(DD)) + "일"

함수 적용


단계별로 생각해 봅시다.

이 함수는 df1 데이터프레임의 '날짜' 열에 date_type_converter 함수를 적용하여 날짜 데이터의 타입을 변환합니다. apply 메소드를 사용하여 각 요소에 함수를 적용함으로써, 열 전체의 데이터 타입을 효율적으로 변환할 수 있습니다.

1
2
3
# 함수 적용
# 날짜 열의 데이터 타입을 변환합니다.
df1['날짜'] = df1['날짜'].apply(date_type_converter)

데이터 병합


단계별로 생각해 봅시다.

두 데이터프레임 df1df2를 ‘날짜’ 열을 기준으로 병합합니다. 이 과정은 pd.merge 함수를 사용하여 수행되며, 결과는 merged_df에 저장됩니다. 이 방식은 두 데이터 세트에서 공통된 ‘날짜’ 정보를 기준으로 합치고자 할 때 유용합니다.

1
2
# 데이터 병합
merged_df = pd.merge(df1, df2, on = '날짜')

merged_df.head() 함수는 데이터프레임에서 상위 5개 행을 반환합니다. 이 함수는 데이터의 구조를 빠르게 확인하고자 할 때 유용하게 사용됩니다.

1
merged_df.head() # 데이터프레임의 상위 5개 행을 출력합니다.

댓글남기기