Berechnung der Monatsdifferenz in Python

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Das Arbeiten mit Daten und Zeiten ist eine häufige Aufgabe in der Programmierung. Python bietet das leistungsstarke Modul datetime, um Datums- und Zeitoperationen effizient zu behandeln. In diesem Lab (Labor) lernen Sie, wie Sie die Differenz zwischen zwei Daten in Monaten berechnen, was für Finanzberechnungen, Projektzeitpläne und Datenanalyse nützlich ist.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/ModulesandPackagesGroup -.-> python/standard_libraries("Common Standard Libraries") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/PythonStandardLibraryGroup -.-> python/date_time("Date and Time") subgraph Lab Skills python/type_conversion -.-> lab-13696{{"Berechnung der Monatsdifferenz in Python"}} python/function_definition -.-> lab-13696{{"Berechnung der Monatsdifferenz in Python"}} python/arguments_return -.-> lab-13696{{"Berechnung der Monatsdifferenz in Python"}} python/standard_libraries -.-> lab-13696{{"Berechnung der Monatsdifferenz in Python"}} python/file_opening_closing -.-> lab-13696{{"Berechnung der Monatsdifferenz in Python"}} python/date_time -.-> lab-13696{{"Berechnung der Monatsdifferenz in Python"}} end

Grundlagen zu Datumsobjekten in Python

Bevor wir die Monatsdifferenz zwischen Daten berechnen, müssen wir verstehen, wie man mit Datumsobjekten in Python arbeitet. In diesem Schritt lernen wir über das datetime-Modul und erstellen einige Datumsobjekte.

Zunächst erstellen wir eine neue Python-Datei im Projektverzeichnis. Öffnen Sie die WebIDE und klicken Sie auf das Symbol "Neue Datei" im Explorer-Bereich auf der linken Seite. Benennen Sie die Datei month_difference.py und speichern Sie sie im Verzeichnis /home/labex/project.

Fügen Sie nun den folgenden Code hinzu, um die erforderlichen Module zu importieren:

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}")

Speichern Sie die Datei und führen Sie sie über das Terminal aus:

python3 ~/project/month_difference.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

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

Die date-Klasse aus dem datetime-Modul ermöglicht es uns, Datumsobjekte zu erstellen, indem wir Jahr, Monat und Tag angeben. Wenn wir ein Datum von einem anderen subtrahieren, gibt Python ein timedelta-Objekt zurück. Wir können die Anzahl der Tage in diesem Objekt über das .days-Attribut abrufen.

In diesem Beispiel liegen zwischen dem 15. Januar 2023 und dem 20. März 2023 64 Tage.

Erstellen der Funktion zur Monatsdifferenzberechnung

Nachdem wir nun verstehen, wie man mit Datumsobjekten arbeitet und die Differenz in Tagen berechnet, erstellen wir eine Funktion zur Berechnung der Differenz in Monaten.

In vielen Anwendungen wird ein Monat auf 30 Tage approximiert. Obwohl dies nicht immer genau ist (Monate können zwischen 28 und 31 Tage haben), ist es eine gängige Vereinfachung, die für viele Geschäftsberechnungen gut funktioniert.

Öffnen Sie Ihre month_difference.py-Datei und fügen Sie diese Funktion unterhalb Ihres bestehenden Codes hinzu:

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

Lassen Sie uns verstehen, was diese Funktion tut:

  1. Sie nimmt zwei Parameter entgegen: start und end, die Datumsobjekte sind.
  2. Sie berechnet die Differenz in Tagen zwischen diesen Daten.
  3. Sie teilt durch 30, um die Tage in Monate umzurechnen.
  4. Sie verwendet ceil(), um auf die nächste ganze Zahl aufzurunden.
  5. Sie gibt das Ergebnis als Ganzzahl zurück.

Die ceil()-Funktion wird verwendet, weil in vielen Geschäftsszenarien auch ein Teilmonat aus Abrechnungsgründen als ganzer Monat gezählt wird.

Um unsere Funktion zu testen, fügen Sie folgenden Code am Ende Ihrer Datei hinzu:

## 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))}")

Speichern Sie Ihre Datei und führen Sie sie erneut aus:

python3 ~/project/month_difference.py

Sie sollten eine Ausgabe wie die folgende sehen:

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

Beachten Sie, dass:

  • Die 64 Tage zwischen dem 15. Januar 2023 und dem 20. März 2023 werden als 3 Monate berechnet (64/30 = 2,13, auf 3 aufgerundet).
  • Die Differenz zwischen dem 28. Oktober und dem 25. November wird als 1 Monat berechnet.
  • Die Differenz zwischen dem 15. Dezember und dem 10. Januar (über ein Jahresende hinweg) wird ebenfalls als 1 Monat berechnet.

Testen mit verschiedenen Datenszenarien

Um besser zu verstehen, wie unsere months_diff-Funktion mit verschiedenen Datenszenarien funktioniert, erstellen wir eine separate Testdatei. Dieser Ansatz ist in der Softwareentwicklung üblich, um zu überprüfen, ob unser Code wie erwartet funktioniert.

Erstellen Sie eine neue Datei namens month_diff_test.py im Verzeichnis /home/labex/project:

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)")

Speichern Sie diese Datei und führen Sie sie aus:

python3 ~/project/month_diff_test.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

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)

Lassen Sie uns diese Ergebnisse analysieren:

  1. Gleicher Monat: Selbst innerhalb desselben Monats gibt unsere Funktion 1 Monat zurück. Dies liegt daran, dass auch ein Teilmonat als ganzer Monat gezählt wird.

  2. Aufeinanderfolgende Monate: Für Daten in aufeinanderfolgenden Monaten gibt die Funktion 1 Monat zurück.

  3. Über Jahresgrenzen hinweg: Für Daten, die die Jahresgrenze überschreiten, berechnet die Funktion weiterhin korrekt.

  4. Mehrere Monate: Für Daten, die mehrere Monate auseinanderliegen, berechnet die Funktion die entsprechende Anzahl von Monaten.

  5. Umgekehrte Reihenfolge: Wenn das Enddatum vor dem Startdatum liegt, erhalten wir ein negatives Ergebnis, was für Szenarien wie die Berechnung der verbleibenden Zeit sinnvoll ist.

  6. Genau Vielfache: Für genau 30 Tage erhalten wir 1 Monat. Für 60 Tage erhalten wir 2 Monate. Dies bestätigt, dass unsere Funktion wie erwartet mit genauen Vielfachen unserer Monatsdefinition funktioniert.

Unsere months_diff-Funktion behandelt alle diese Testfälle korrekt, wenn wir einen Monat als 30 Tage definieren.

Erstellen einer praktischen Anwendung: Abonnementrechner

Nachdem wir nun eine zuverlässige Funktion zur Berechnung von Monatsdifferenzen haben, wenden wir sie auf ein reales Szenario an. Wir werden einen Abonnementrechner erstellen, der die Kosten eines Service-Abonnements zwischen zwei Daten berechnet.

Erstellen Sie eine neue Datei namens subscription_calculator.py im Verzeichnis /home/labex/project:

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}")

Speichern Sie die Datei und führen Sie sie aus:

python3 ~/project/subscription_calculator.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen (die Testzeitraum-Daten zeigen Ihr aktuelles Datum):

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

Diese Anwendung zeigt, wie unsere months_diff-Funktion in einem praktischen Szenario eingesetzt werden kann:

  1. Wir berechnen die Gesamtkosten eines Abonnements basierend auf der Anzahl der Monate zwischen zwei Daten.
  2. Wir vergleichen diese Kosten mit einem Jahresplan, um einem Benutzer zu helfen, zu entscheiden, welcher Plan wirtschaftlicher ist.
  3. Wir berechnen die Kosten für einen kurzen Testzeitraum.

Beachten Sie, dass auch der 7-Tage-Testzeitraum in unserem Modell als ein ganzer Monat berechnet wird. Dies liegt daran, dass unsere Funktion jeden Teilmonat auf einen vollen Monat aufrundet, was bei der Abrechnung von Abonnements üblich ist.

Diese Art der Berechnung wird häufig in folgenden Bereichen verwendet:

  • Abonnementdiensten (Streaming, Software, Mitgliedschaften)
  • Kredit- und Hypothekenberechnungen
  • Mietverträgen
  • Projektabrechnungen

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man in Python die Monatsdifferenz zwischen zwei Daten berechnet. Hier ist, was Sie erreicht haben:

  1. Sie haben gelernt, wie man mit Datumsobjekten aus dem datetime-Modul arbeitet.
  2. Sie haben eine months_diff-Funktion erstellt, die Monatsdifferenzen unter Verwendung einer 30-Tage-Monatsnäherung berechnet.
  3. Sie haben die Funktion mit verschiedenen Datenszenarien getestet, um sicherzustellen, dass sie korrekt funktioniert.
  4. Sie haben die Funktion auf ein reales Szenario angewendet, indem Sie einen Abonnementrechner erstellt haben.

Diese Fähigkeiten sind für viele Anwendungen wertvoll, darunter:

  • Finanzielle Berechnungen (Kredite, Investitionen, Abrechnungen)
  • Projektplanung und -management
  • Abonnementdienste
  • Datumsbasierte Datenanalyse

Um Ihre Fähigkeiten beim Arbeiten mit Daten in Python weiter zu verbessern, könnten Sie folgendes untersuchen:

  • Arbeiten mit Zeitkomponenten unter Verwendung von datetime.datetime
  • Umgang mit verschiedenen Zeitzonen unter Verwendung der pytz-Bibliothek
  • Verwenden der dateutil-Bibliothek für fortgeschrittene Datumsoperationen
  • Implementieren verschiedener Ansätze zur Berechnung von Monatsdifferenzen (z. B. Kalendermonate anstelle von 30-Tage-Perioden)

Datums- und Zeitberechnungen sind in vielen Programmieraufgaben unerlässlich, und die Techniken, die Sie in diesem Lab gelernt haben, bilden eine solide Grundlage für die Durchführung dieser Berechnungen in Ihren Python-Projekten.