Calculer la différence de mois en Python

PythonPythonBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Travailler avec les dates et les heures est une tâche courante en programmation. Python propose le puissant module datetime pour gérer efficacement les opérations liées aux dates et aux heures. Dans ce labo (LabEx), vous apprendrez à calculer la différence entre deux dates en termes de mois, ce qui est utile pour les calculs financiers, les calendriers de projets et l'analyse de données.


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{{"Calculer la différence de mois en Python"}} python/function_definition -.-> lab-13696{{"Calculer la différence de mois en Python"}} python/arguments_return -.-> lab-13696{{"Calculer la différence de mois en Python"}} python/standard_libraries -.-> lab-13696{{"Calculer la différence de mois en Python"}} python/file_opening_closing -.-> lab-13696{{"Calculer la différence de mois en Python"}} python/date_time -.-> lab-13696{{"Calculer la différence de mois en Python"}} end

Comprendre les objets de date en Python

Avant de calculer la différence en mois entre des dates, nous devons comprendre comment travailler avec les objets de date en Python. Dans cette étape, nous allons apprendre à propos du module datetime et créer quelques objets de date.

Tout d'abord, créons un nouveau fichier Python dans le répertoire du projet. Ouvrez le WebIDE et cliquez sur l'icône "Nouveau fichier" dans le panneau d'exploration à gauche. Nommez le fichier month_difference.py et enregistrez-le dans le répertoire /home/labex/project.

Maintenant, ajoutez le code suivant pour importer les modules nécessaires :

from datetime import date
from math import ceil

## Create example date objects
date1 = date(2023, 1, 15)  ## 15 janvier 2023
date2 = date(2023, 3, 20)  ## 20 mars 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}")

Enregistrez le fichier et exécutez-le en utilisant le terminal :

python3 ~/project/month_difference.py

Vous devriez voir une sortie similaire à ceci :

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

La classe date du module datetime nous permet de créer des objets de date en spécifiant l'année, le mois et le jour. Lorsque nous soustrayons une date d'une autre, Python retourne un objet timedelta. Nous pouvons accéder au nombre de jours dans cet objet en utilisant l'attribut .days.

Dans cet exemple, il y a 64 jours entre le 15 janvier 2023 et le 20 mars 2023.

Création de la fonction de calcul de la différence en mois

Maintenant que nous savons comment travailler avec les objets de date et calculer la différence en jours, créons une fonction pour calculer la différence en mois.

Dans de nombreuses applications, un mois est approximé à 30 jours. Bien que ce ne soit pas toujours précis (les mois peuvent avoir de 28 à 31 jours), c'est une simplification courante qui fonctionne bien pour de nombreux calculs commerciaux.

Ouvrez votre fichier month_difference.py et ajoutez cette fonction sous votre code existant :

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

Comprenons ce que fait cette fonction :

  1. Elle prend deux paramètres : start et end, qui sont des objets de date
  2. Elle calcule la différence en jours entre ces dates
  3. Elle divise par 30 pour convertir les jours en mois
  4. Elle utilise ceil() pour arrondir au nombre entier supérieur
  5. Elle retourne le résultat sous forme d'entier

La fonction ceil() est utilisée car dans de nombreux scénarios commerciaux, même un mois partiel est compté comme un mois entier pour les facturations.

Pour tester notre fonction, ajoutez le code suivant à la fin de votre fichier :

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

Enregistrez votre fichier et exécutez-le à nouveau :

python3 ~/project/month_difference.py

Vous devriez voir une sortie comme celle-ci :

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

Remarquez que :

  • Les 64 jours entre le 15 janvier 2023 et le 20 mars 2023 sont calculés comme 3 mois (64/30 = 2,13, arrondi à 3)
  • La différence entre le 28 octobre et le 25 novembre est calculée comme 1 mois
  • La différence entre le 15 décembre et le 10 janvier (au-delà d'une limite d'année) est également calculée comme 1 mois

Tests avec divers scénarios de dates

Pour mieux comprendre comment notre fonction months_diff fonctionne avec différents scénarios de dates, créons un fichier de test séparé. Cette approche est courante dans le développement logiciel pour vérifier que notre code fonctionne comme prévu.

Créez un nouveau fichier appelé month_diff_test.py dans le répertoire /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)")

Enregistrez ce fichier et exécutez-le :

python3 ~/project/month_diff_test.py

Vous devriez voir une sortie similaire à :

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)

Analysons ces résultats :

  1. Même mois : Même dans le même mois, notre fonction retourne 1 mois. C'est parce que même un mois partiel est compté comme un mois entier.

  2. Mois consécutifs : Pour des dates dans des mois consécutifs, la fonction retourne 1 mois.

  3. Au-delà des années : Pour des dates qui traversent la limite d'année, la fonction calcule toujours correctement.

  4. Plusieurs mois : Pour des dates séparées de plusieurs mois, la fonction calcule le nombre approprié de mois.

  5. Ordre inverse : Lorsque la date de fin est antérieure à la date de début, nous obtenons un résultat négatif, ce qui est logique pour des scénarios tels que le calcul du temps restant.

  6. Multiples exacts : Pour exactement 30 jours, nous obtenons 1 mois. Pour 60 jours, nous obtenons 2 mois. Cela confirme que notre fonction fonctionne comme prévu avec des multiples exacts de notre définition de mois.

Notre fonction months_diff gère correctement tous ces cas de test selon notre définition d'un mois comme étant de 30 jours.

Création d'une application pratique : Calculateur d'abonnement

Maintenant que nous avons une fonction fiable pour calculer les différences de mois, appliquons-la à un scénario du monde réel. Nous allons créer un calculateur d'abonnement qui détermine le coût d'un abonnement à un service entre deux dates.

Créez un nouveau fichier appelé subscription_calculator.py dans le répertoire /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}")

Enregistrez le fichier et exécutez-le :

python3 ~/project/subscription_calculator.py

Vous devriez voir une sortie similaire à celle-ci (les dates d'essai afficheront votre date actuelle) :

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

Cette application montre comment notre fonction months_diff peut être utilisée dans un scénario pratique :

  1. Nous calculons le coût total d'un abonnement en fonction du nombre de mois entre deux dates
  2. Nous comparons ce coût avec un forfait annuel pour aider un utilisateur à décider quel forfait est le plus économique
  3. Nous calculons le coût d'une courte période d'essai

Remarquez comment même la période d'essai de 7 jours est facturée comme un mois entier dans notre modèle. C'est parce que notre fonction arrondit tout mois partiel à un mois entier, ce qui est courant dans la facturation des abonnements.

Ce type de calcul est fréquemment utilisé dans :

  • Les services d'abonnement (streaming, logiciels, adhésions)
  • Les calculs de prêts et de hypothèques
  • Les contrats de location
  • La facturation de projets

Résumé

Dans ce laboratoire (lab), vous avez appris à calculer la différence de mois entre deux dates en Python. Voici ce que vous avez accompli :

  1. Vous avez appris à travailler avec les objets de date du module datetime
  2. Vous avez créé une fonction months_diff qui calcule les différences de mois en utilisant une approximation d'un mois de 30 jours
  3. Vous avez testé la fonction avec divers scénarios de dates pour vous assurer qu'elle fonctionne correctement
  4. Vous avez appliqué la fonction à un scénario du monde réel en créant un calculateur d'abonnement

Ces compétences sont précieuses pour de nombreuses applications, notamment :

  • Les calculs financiers (prêts, investissements, facturation)
  • La planification et la gestion de projets
  • Les services d'abonnement
  • L'analyse de données basée sur les dates

Pour améliorer encore vos compétences dans le travail avec les dates en Python, vous pourriez explorer :

  • Le travail avec les composantes temporelles en utilisant datetime.datetime
  • La gestion des différents fuseaux horaires en utilisant la bibliothèque pytz
  • L'utilisation de la bibliothèque dateutil pour des opérations de date plus avancées
  • La mise en œuvre de différentes approches pour calculer les différences de mois (par exemple, les mois calendaires au lieu de périodes de 30 jours)

Les calculs de date et d'heure sont essentiels dans de nombreuses tâches de programmation, et les techniques que vous avez apprises dans ce laboratoire fournissent une solide base pour gérer ces calculs dans vos projets Python.