Python 에서 월 차이 계산하기

Beginner

This tutorial is from open-source community. Access the source code

소개

날짜와 시간으로 작업하는 것은 프로그래밍에서 흔한 작업입니다. Python 은 날짜 및 시간 연산을 효율적으로 처리하기 위해 강력한 datetime 모듈을 제공합니다. 이 랩에서는 금융 계산, 프로젝트 타임라인, 데이터 분석 등에 유용한 두 날짜 간의 월 단위 차이를 계산하는 방법을 배우게 됩니다.

Python 에서 날짜 객체 이해하기

날짜 간의 월 차이를 계산하기 전에, Python 에서 날짜 객체로 작업하는 방법을 이해해야 합니다. 이 단계에서는 datetime 모듈에 대해 배우고 몇 가지 날짜 객체를 생성할 것입니다.

먼저, 프로젝트 디렉토리에 새 Python 파일을 생성해 보겠습니다. WebIDE 를 열고 왼쪽 탐색 패널에서 "New File" 아이콘을 클릭합니다. 파일 이름을 month_difference.py로 지정하고 /home/labex/project 디렉토리에 저장합니다.

이제 필요한 모듈을 가져오기 위해 다음 코드를 추가합니다.

from datetime import date
from math import ceil

## Create example date objects
date1 = date(2023, 1, 15)  ## January 15, 2023
date2 = date(2023, 3, 20)  ## March 20, 2023

## Print the dates to see their format
print(f"Date 1: {date1}")
print(f"Date 2: {date2}")

## Calculate the difference in days
day_difference = (date2 - date1).days
print(f"Difference in days: {day_difference}")

파일을 저장하고 터미널을 사용하여 실행합니다.

python3 ~/project/month_difference.py

다음과 유사한 출력을 볼 수 있습니다.

Date 1: 2023-01-15
Date 2: 2023-03-20
Difference in days: 64

datetime 모듈의 date 클래스를 사용하면 연, 월, 일을 지정하여 날짜 객체를 생성할 수 있습니다. 한 날짜에서 다른 날짜를 빼면 Python 은 timedelta 객체를 반환합니다. .days 속성을 사용하여 이 객체 내의 일 수를 액세스할 수 있습니다.

이 예제에서는 2023 년 1 월 15 일과 2023 년 3 월 20 일 사이에 64 일이 있습니다.

월 차이 함수 생성하기

이제 날짜 객체로 작업하고 일 차이를 계산하는 방법을 이해했으므로, 월 차이를 계산하는 함수를 만들어 보겠습니다.

많은 애플리케이션에서 한 달은 30 일로 근사됩니다. 이것이 항상 정확하지는 않지만 (달은 28 일에서 31 일까지 가질 수 있음), 많은 비즈니스 계산에 잘 맞는 일반적인 단순화입니다.

month_difference.py 파일을 열고 기존 코드 아래에 이 함수를 추가합니다.

def months_diff(start, end):
    """
    Calculate the difference in months between two dates.

    Args:
        start (date): The start date
        end (date): The end date

    Returns:
        int: The number of months between the dates (rounded up)
    """
    ## Calculate the difference in days
    days_difference = (end - start).days

    ## Convert days to months (assuming 30 days per month) and round up
    months = ceil(days_difference / 30)

    return months

이 함수가 무엇을 하는지 이해해 봅시다.

  1. startend의 두 매개변수를 사용하며, 이는 날짜 객체입니다.
  2. 이 날짜 간의 일 차이를 계산합니다.
  3. 일 수를 월 수로 변환하기 위해 30 으로 나눕니다.
  4. 가장 가까운 정수로 올림하기 위해 ceil()을 사용합니다.
  5. 결과를 정수로 반환합니다.

ceil() 함수는 많은 비즈니스 시나리오에서 부분적인 달조차도 청구 목적으로 전체 달로 계산되기 때문에 사용됩니다.

함수를 테스트하려면 파일 끝에 다음 코드를 추가합니다.

## Test the months_diff function with our example dates
print(f"Months between {date1} and {date2}: {months_diff(date1, date2)}")

## Test with some other date pairs
print(f"Months between 2020-10-28 and 2020-11-25: {months_diff(date(2020, 10, 28), date(2020, 11, 25))}")
print(f"Months between 2020-12-15 and 2021-01-10: {months_diff(date(2020, 12, 15), date(2021, 01, 10))}")

파일을 저장하고 다시 실행합니다.

python3 ~/project/month_difference.py

다음과 같은 출력을 볼 수 있습니다.

Date 1: 2023-01-15
Date 2: 2023-03-20
Difference in days: 64
Months between 2023-01-15 and 2023-03-20: 3
Months between 2020-10-28 and 2020-11-25: 1
Months between 2020-12-15 and 2021-01-10: 1

다음 사항에 유의하십시오.

  • 2023-01-15 와 2023-03-20 사이의 64 일은 3 개월로 계산됩니다 (64/30 = 2.13, 올림하여 3).
  • 10 월 28 일과 11 월 25 일 사이의 차이는 1 개월로 계산됩니다.
  • 12 월 15 일과 1 월 10 일 사이의 차이 (연도 경계를 넘는 경우) 도 1 개월로 계산됩니다.

다양한 날짜 시나리오로 테스트하기

months_diff 함수가 다양한 날짜 시나리오에서 어떻게 작동하는지 더 잘 이해하기 위해 별도의 테스트 파일을 만들어 보겠습니다. 이 접근 방식은 코드가 예상대로 작동하는지 확인하기 위해 소프트웨어 개발에서 일반적입니다.

/home/labex/project 디렉토리에 month_diff_test.py라는 새 파일을 생성합니다.

from datetime import date
from month_difference import months_diff

## Test scenario 1: Dates in the same month
date1 = date(2023, 5, 5)
date2 = date(2023, 5, 25)
print(f"Same month: {months_diff(date1, date2)} month(s)")

## Test scenario 2: Consecutive months
date3 = date(2023, 6, 28)
date4 = date(2023, 7, 15)
print(f"Consecutive months: {months_diff(date3, date4)} month(s)")

## Test scenario 3: Dates crossing year boundary
date5 = date(2023, 12, 20)
date6 = date(2024, 1, 10)
print(f"Across years: {months_diff(date5, date6)} month(s)")

## Test scenario 4: Several months apart
date7 = date(2023, 3, 10)
date8 = date(2023, 9, 20)
print(f"Several months: {months_diff(date7, date8)} month(s)")

## Test scenario 5: Dates in reverse order (negative result)
print(f"Reverse order: {months_diff(date8, date7)} month(s)")

## Test scenario 6: Exact multiples of 30 days
date9 = date(2023, 1, 1)
date10 = date(2023, 1, 31)  ## 30 days
date11 = date(2023, 3, 2)   ## 60 days
print(f"30 days exactly: {months_diff(date9, date10)} month(s)")
print(f"60 days exactly: {months_diff(date9, date11)} month(s)")

이 파일을 저장하고 실행합니다.

python3 ~/project/month_diff_test.py

다음과 유사한 출력을 볼 수 있습니다.

Same month: 1 month(s)
Consecutive months: 1 month(s)
Across years: 1 month(s)
Several months: 7 month(s)
Reverse order: -7 month(s)
30 days exactly: 1 month(s)
60 days exactly: 2 month(s)

이 결과를 분석해 보겠습니다.

  1. Same month (같은 달): 같은 달 내에서도 함수는 1 개월을 반환합니다. 이는 부분적인 달조차도 전체 달로 계산되기 때문입니다.

  2. Consecutive months (연속된 달): 연속된 달의 날짜에 대해 함수는 1 개월을 반환합니다.

  3. Across years (연도 경계 넘기): 연도 경계를 넘는 날짜에 대해서도 함수는 올바르게 계산합니다.

  4. Several months (여러 달): 여러 달 차이가 나는 날짜에 대해 함수는 적절한 개월 수를 계산합니다.

  5. Reverse order (역순): 종료 날짜가 시작 날짜보다 앞선 경우 음수 결과가 나타나며, 이는 남은 시간을 계산하는 시나리오에 적합합니다.

  6. Exact multiples (정확한 배수): 정확히 30 일인 경우 1 개월을 얻습니다. 60 일인 경우 2 개월을 얻습니다. 이는 함수가 월 정의의 정확한 배수로 예상대로 작동함을 확인합니다.

months_diff 함수는 한 달을 30 일로 정의하는 방식에 따라 이러한 모든 테스트 케이스를 올바르게 처리합니다.

실용적인 애플리케이션 생성: 구독 계산기

이제 월 차이를 계산하는 신뢰할 수 있는 함수가 있으므로, 이를 실제 시나리오에 적용해 보겠습니다. 두 날짜 사이의 서비스 구독 비용을 결정하는 구독 계산기를 만들 것입니다.

/home/labex/project 디렉토리에 subscription_calculator.py라는 새 파일을 생성합니다.

from datetime import date, timedelta
from month_difference import months_diff

def calculate_subscription_cost(start_date, end_date, monthly_fee):
    """
    Calculate the total cost of a subscription between two dates.

    Args:
        start_date (date): Subscription start date
        end_date (date): Subscription end date
        monthly_fee (float): Cost per month

    Returns:
        float: Total subscription cost
    """
    ## Calculate number of months
    months = months_diff(start_date, end_date)

    ## Calculate total cost
    total_cost = months * monthly_fee

    return total_cost

## Example: Calculate subscription cost for a streaming service
start = date(2023, 1, 15)  ## Subscription starts January 15, 2023
end = date(2023, 8, 20)    ## Ends August 20, 2023
monthly_cost = 9.99        ## $9.99 per month

total = calculate_subscription_cost(start, end, monthly_cost)
print(f"Subscription period: {start} to {end}")
print(f"Monthly fee: ${monthly_cost:.2f}")
print(f"Total cost: ${total:.2f}")

## Compare with an annual plan
annual_cost = 99.99  ## $99.99 per year
print(f"\nAnnual plan cost: ${annual_cost:.2f}")
print(f"Monthly plan for same period: ${total:.2f}")

if total > annual_cost:
    print(f"Savings with annual plan: ${total - annual_cost:.2f}")
else:
    print(f"Additional cost for annual plan: ${annual_cost - total:.2f}")

## Calculate cost for a trial period
today = date.today()
trial_end = today + timedelta(days=7)  ## 7-day trial
trial_cost = calculate_subscription_cost(today, trial_end, monthly_cost)
print(f"\nOne-week trial period: {today} to {trial_end}")
print(f"Trial period cost: ${trial_cost:.2f}")

파일을 저장하고 실행합니다.

python3 ~/project/subscription_calculator.py

다음과 유사한 출력을 볼 수 있습니다 (체험 날짜는 현재 날짜를 표시합니다).

Subscription period: 2023-01-15 to 2023-08-20
Monthly fee: $9.99
Total cost: $79.92

Annual plan cost: $99.99
Monthly plan for same period: $79.92
Additional cost for annual plan: $20.07

One-week trial period: 2023-06-01 to 2023-06-08
Trial period cost: $9.99

이 애플리케이션은 months_diff 함수를 실제 시나리오에서 어떻게 사용할 수 있는지 보여줍니다.

  1. 두 날짜 사이의 개월 수를 기준으로 구독의 총 비용을 계산합니다.
  2. 사용자가 어떤 요금제가 더 경제적인지 결정하도록 돕기 위해 이 비용을 연간 요금제와 비교합니다.
  3. 짧은 체험 기간의 비용을 계산합니다.

7 일 체험 기간조차도 모델에서 한 달 전체로 청구되는 것을 확인하십시오. 이는 함수가 부분적인 달을 전체 달로 올림하기 때문이며, 이는 구독 청구에서 일반적입니다.

이러한 유형의 계산은 다음에서 자주 사용됩니다.

  • 구독 서비스 (스트리밍, 소프트웨어, 멤버십)
  • 대출 및 모기지 계산
  • 임대 계약
  • 프로젝트 청구

요약

이 랩에서는 Python 에서 두 날짜 사이의 월 차이를 계산하는 방법을 배웠습니다. 다음은 여러분이 달성한 내용입니다.

  1. datetime 모듈에서 날짜 객체를 사용하는 방법을 배웠습니다.
  2. 30 일 월 근사치를 사용하여 월 차이를 계산하는 months_diff 함수를 만들었습니다.
  3. 함수가 올바르게 작동하는지 확인하기 위해 다양한 날짜 시나리오로 함수를 테스트했습니다.
  4. 구독 계산기를 생성하여 함수를 실제 시나리오에 적용했습니다.

이러한 기술은 다음과 같은 많은 애플리케이션에 유용합니다.

  • 금융 계산 (대출, 투자, 청구)
  • 프로젝트 계획 및 관리
  • 구독 서비스
  • 날짜 기반 데이터 분석

Python 에서 날짜를 사용하는 기술을 더욱 향상시키려면 다음을 탐색할 수 있습니다.

  • datetime.datetime을 사용하여 시간 구성 요소 작업
  • pytz 라이브러리를 사용하여 다른 시간대 처리
  • 더 고급 날짜 연산을 위해 dateutil 라이브러리 사용
  • 월 차이를 계산하는 다른 접근 방식 구현 (예: 30 일 기간 대신 달력 월)

날짜 및 시간 계산은 많은 프로그래밍 작업에 필수적이며, 이 랩에서 배운 기술은 Python 프로젝트에서 이러한 계산을 처리하기 위한 견고한 기반을 제공합니다.