IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Calculer le nbre de jours entre deux dates au format AAAA-MM-JJ [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 602
    Par défaut Calculer le nbre de jours entre deux dates au format AAAA-MM-JJ
    Bonjour !

    Bon , je vais probablement me faire déchiqueter sur place par @sver ou wiztricks mais tant pis, j'expose mon problème.

    Pour des besoins de comparaison de dates entre elles, j'ai besoin de calculer le nombre de jours séparant la date du jour d'une date donnée.

    Pour ce faire, j'ai une classe Converter qui, entre autres, dispose d'une méthode statique nommée gap_with_today :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from datetime import datetime
    from typing import ClassVar
     
    class Converter:
        TODAY: ClassVar[str] = datetime.now().strftime("%Y-%m-%d")
     
        @staticmethod
        def gap_with_today(date: str) -> int:
            return (
                datetime.strptime(Converter.TODAY, "%Y-%m-%d").date().day
                - datetime.strptime(date, "%Y-%m-%d").date().day)
    Voici mon test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from datetime import datetime
    import pytest
    from app.converter import Converter
     
    @pytest.fixture
    def conv() -> Converter:
        return Converter()
     
    class TestConverter:
        @pytest.mark.parametrize(
            "date,expected",
            [
                ("2022-01-01", 0),
                ("2022-12-31", -365),
            ],
        )
        def test_gap_with_today(self, conv: Converter, date: str, expected: int) -> None:
            Converter.TODAY = "2022-01-01"
            assert conv.gap_with_today(date) == expected
    Comme on le voit, dans le test je force la date du jour à devenir 2022-01-01. Lorsque le test passe sur le 1er élément de la fixture parametrize de pytest, le résultat attendu donne bien 0 en retour (2022-01-01 - 2022-01-01). Pour le second élément de la fixture, je m'attends à avoir -365 comme résultat de la différence en nombre de jours entre 2022-01-01 et 2022-12-31.

    Mais le test passe au rouge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FAILED tests/unit/test_converter.py::TestConverter::test_gap_with_today[2022-12-31-365] - AssertionError: assert -30 == -365
    La méthode retourne -30 en écart alors forcément, pytest se plaint.

    Chuis pas doué avec les dates, ça vous l'aurez remarqué mais avez-vous un moyen simple de comparer deux dates formatées %Y-%m-%d de manière plus efficace ?

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Arioch Voir le message
    je vais probablement me faire déchiqueter sur place par @sver ou wiztricks mais tant pis, j'expose mon problème.
    J'adore !


    Petit test sur les genoux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import datetime
     
    d1 = datetime.date(2022, 1, 1)
    d2 = datetime.date(2022, 1, 1)
    print(d2-d1)
    0:00:00
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import datetime
     
    d1 = datetime.date(2022, 1, 1)
    d2 = datetime.date(2022, 12, 31)
    print(d1-d2)
    -364 days, 0:00:00

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 503
    Par défaut
    une de tes erreurs c'est le .day qui renvoie le nombre de jour du mois de l'année et pas le nombre de jour depuis le début de l'année comme tu devais le croire (sinon c'est le yday du .timetuple() https://docs.python.org/fr/3/library...date.timetuple )

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Une autre erreur aussi, c'est de mettre TODAY de ton objet Converter en tant qu'attribut statique. Si tu crées deux instances de Converter, le TODAY sera le même pour les deux. C'est peut-être pas forcément adéquat... (ce qui influe alors sur la méthode statique gap_with_today() qui, dès lors, ne sera, elle non plus, plus statique)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 602
    Par défaut
    Merci à tous pour vos retours !

    J'ai mis en place ceci dans le code et les tests passent au vert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from datetime import datetime, date
    from typing import ClassVar
     
    class Converter:
        TODAY: ClassVar[str] = datetime.now().strftime("%Y-%m-%d")
     
        @staticmethod
        def gap_with_today(date_: str) -> int:
            today: date.fromisoformat = date.fromisoformat(Converter.TODAY)
            old_date: date.fromisoformat = date.fromisoformat(date_)
            return (today - old_date).days

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 602
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    L'objet timedelta ??? (zut, c'était vraiment trop facile de te déchiqueter... )
    Alors, timedelta, c'est ce que j'avais regardé en premier mais je n'ai pas lu la bonne doc et elle ne parlait pas de fromisoformat que j'ai utilisé.

    Citation Envoyé par Sve@r Voir le message
    Une autre erreur aussi, c'est de mettre TODAY de ton objet Converter en tant qu'attribut statique. Si tu crées deux instances de Converter, le TODAY sera le même pour les deux. C'est peut-être pas forcément adéquat... (ce qui influe alors sur la méthode statique gap_with_today() qui, dès lors, ne sera, elle non plus, plus statique)...
    Dans le cas du mec déchiqueté il n'y aura jamais plus d'une instance de la classe Converter.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Dans le cas du mec déchiqueté il n'y aura jamais plus d'une instance de la classe Converter.
    Ca c'est pas une bonne approche. Le but d'un objet est d'être réutilisable dans différentes configurations. Si les codeurs de la classe str avaient dit "bah c'est pas grave si la chaine est statique car chez-moi je n'utilise qu'une seule instance" ben personne ne l'utiliserait.
    Tu as le droit d'avoir des attributs statiques mais uniquement si ces attributs répondent à une problématique associée à ton objet, pas à ta façon de l'utiliser. Si moi je me dis "ah il a l'air pas mal cet objet Converter" mais que derrière je rajoute "dommage que son TODAY soit statique car j'en aurais bien eu besoin dans plusieurs instances" quelque part tu as raté ton objet.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tyrtamos Voir le message
    J'adore !
    Moi aussi

    Citation Envoyé par Arioch Voir le message
    Bon , je vais probablement me faire déchiqueter sur place par @sver ou wiztricks mais tant pis, j'expose mon problème.
    Ouais vas-y, no-limit/no-fear

    Citation Envoyé par Arioch Voir le message
    mais avez-vous un moyen simple de comparer deux dates formatées %Y-%m-%d de manière plus efficace ?
    L'objet timedelta ??? (zut, c'était vraiment trop facile de te déchiqueter... )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 12h32
  3. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  4. Pb avec les dates < année 2000
    Par elitost dans le forum Oracle
    Réponses: 2
    Dernier message: 15/09/2004, 12h37
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo