MINERVA/Python 2024. 3. 2. 14:28
반응형

해당 에러메시지 내용을 보면, 파서가 날짜 형식을 자동으로 결정(추론)할 수 없고, 그래서 일관성과 정확성을 위해 명시적으로 형식을 지정하라고 요구합니다..(유사한 예로, C++의 STATIC_CASTING을 생각하시면 됩니다.)

 

아래의 코드를 보면, 직관적으로 이해가 가능하실것입니다.

에러 발생화면

변환을 하고자 하는 시간데이타는 위와 같습니다.

 

위와 같이 시간데이타의 foramt이 '시간:분:초'로 되어 있으므로, 아래와 같이 수정하면 됩니다.

#concatDf['dates'] = pd.to_datetime(concatDf['시간'])

(수정) concatDf['dates'] = pd.to_datetime(concatDf['시간'], format='%H:%M:%S')

 

추가적으로 데이타의 format이 '연-월-일'인 경우는 아래와 같이 수정하면 됩니다.

concatDf['dates'] = pd.to_datetime(concatDf['dates'], format='%Y-%m-%d')

반응형
posted by choiwonwoo
:
MINERVA/Python 2024. 1. 30. 16:56
반응형

Pandas를 사용하여 DataFrame에서 특정 키 값이 같은 행이 두 개 이상일 때, 날짜 또는 최근 업데이트된 행만 남기는 방법은 다음과 같이 할 수 있습니다

 

아래와 같이 기본데이타를 보면, 

data = {'key': ['A', 'B', 'A', 'B', 'C'],
        '날짜': ['2024-01-01', '2024-02-01', '2024-03-01', '2024-02-15', '2024-04-01'],
        '값': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
print(df)

 

   key       날짜   값
0   A  2024-01-01  10
1   B  2024-02-01  20
2   A  2024-03-01  30
3   B  2024-02-15  40
4   C  2024-04-01  50
 

 

Key가 같은 데이타가 불규칙하게 중복되어 있습니다.

해당 데이타에서 키값을 기준으로 마지막 데이타만 추출하는 방법은 아래와 같습니다.

result_df = df.sort_values(by='날짜').drop_duplicates('key', keep='last')
print(result_df)
  key   날짜        값
3   B  2024-02-15  40
2   A  2024-03-01  30
4   C  2024-04-01  50

 

이 코드에서 sort_values 함수는 '키'를 사용하여 오름 차순(default)으로 정열합니다.

그리고, drop_duplicates 함수를 사용하여 키 열을 기준으로 중복된 행을 제거하는데, 마지막행(keep='last'을 남기게 됩니다.

추가적으로, 중복행을 제거할때, 정렬된 행의 처음 행을 남길때는 keep='first' 로 설정하면 됩니다.

 

반응형
posted by choiwonwoo
:
MINERVA/Python 2024. 1. 21. 11:11
반응형

ZeroDivisionError: division by zero는 주로 코드에서 어떤 값을 0으로 나누려고 할 때 발생하는 오류입니다. 

이 오류를 피하는 몇 가지 방법을 아래와 같이 정리합니다.

 

1. 분모가 0인 경우를 확인하여 처리하기.

 

def ZeroDivisionError_Solve1():

    divisor = 0
    numerator = 10

    if divisor != 0:
        result = numerator / divisor
    else:
        result = 0  # 또는 다른 적절한 값을 할당

    print(result)

 

2. 예외처리 사용

0으로 나누려고 할 때 ZeroDivisionError 예외가 발생하면 예외 처리 블록이 실행되어 0 또는 다른 적절한 값을 할당

def ZeroDivisionError_Solve2():

    divisor = 0
    numerator = 10

    try:
        result = numerator / divisor
    except ZeroDivisionError:
        result = 0  # 또는 다른 적절한 값을 할당

    print(result)

 

3. numpy의 np.divide 함수 사용

분모가 0인 경우에 대해 예외를 발생시키지 않고, 대신 where 매개변수를 사용하여 분모가 0이 아닌 경우에만 나누기 연산

def ZeroDivisionError_Solve3():

    divisor = 0
    numerator = 10

    result = np.divide(numerator, divisor, out=np.zeros_like(numerator), casting='unsafe',where= divisor != 0)

    print(result)

 

4. 분모가 0인 경우에 대한 조건문 사용

각 행(row)에 대해 분모가 0이 아닌 경우에만 나누기 연산을 수행하고, 그렇지 않은 경우에는 0을 할당합니다.

def ZeroDivisionError_Solve4():

    data = {'numerator': [10, 20, 30],
            'divisor': [5, 0, 3]}
    df = pd.DataFrame(data)

    # 분모가 0이 아닌 경우에만 나누기 연산 수행
    df['result'] = df.apply(lambda row: row['numerator'] / row['divisor'] if row['divisor'] != 0 else 0, axis=1)

    print(df)

 

5. numpy의 np.where 사용

np.where를 사용하여 분모가 0이 아닌 경우에는 나누기 연산을 수행하고, 그렇지 않은 경우에는 0을 할당

def ZeroDivisionError_Solve5():
    # 예제 DataFrame 생성
    data = {'numerator': [10, 20, 30],
            'divisor': [5, 0, 3]}
    df = pd.DataFrame(data)

    # np.where를 사용하여 분모가 0인 경우에 대한 처리
    df['result'] = np.where(df['divisor'] != 0, df['numerator'] / df['divisor'], 0)

    print(df)

 

[전체코드]

import numpy as np
import pandas as pd

def ZeroDivisionError_Solve1():

    divisor = 0
    numerator = 10

    if divisor != 0:
        result = numerator / divisor
    else:
        result = 0  # 또는 다른 적절한 값을 할당

    print(result)

def ZeroDivisionError_Solve2():

    divisor = 0
    numerator = 10

    try:
        result = numerator / divisor
    except ZeroDivisionError:
        result = 0  # 또는 다른 적절한 값을 할당

    print(result)

def ZeroDivisionError_Solve3():

    divisor = 0
    numerator = 10

    result = np.divide(numerator, divisor, out=np.zeros_like(numerator), casting='unsafe',where= divisor != 0)

    print(result)


def ZeroDivisionError_Solve4():

    data = {'numerator': [10, 20, 30],
            'divisor': [5, 0, 3]}
    df = pd.DataFrame(data)

    # 분모가 0이 아닌 경우에만 나누기 연산 수행
    df['result'] = df.apply(lambda row: row['numerator'] / row['divisor'] if row['divisor'] != 0 else 0, axis=1)

    print(df)


def ZeroDivisionError_Solve5():
    # 예제 DataFrame 생성
    data = {'numerator': [10, 20, 30],
            'divisor': [5, 0, 3]}
    df = pd.DataFrame(data)

    # np.where를 사용하여 분모가 0인 경우에 대한 처리
    df['result'] = np.where(df['divisor'] != 0, df['numerator'] / df['divisor'], 0)

    print(df)


if __name__ == '__main__':
    print(f'ZeroDivisionError: division by zero')

    ZeroDivisionError_Solve1()
    ZeroDivisionError_Solve2()
    ZeroDivisionError_Solve3()
    ZeroDivisionError_Solve4()
    ZeroDivisionError_Solve5()
반응형
posted by choiwonwoo
: