Partage
  • Partager sur Facebook
  • Partager sur Twitter

comparaison entre deux dates python

    11 novembre 2019 à 15:39:58

    Bonjour voici mon code pour créer une variable 'attente' dans le cours 'nettoyer votre jeu de donées". 

    import datetime as dt
    
    # Selection du sous-échantillon
    courses = data[data.categ == "COURSES"]
    
    # On trie les opérations par date
    courses = courses.sort_values("date_operation")
    
    # On ramène les montants en positif
    courses["montant"] = -courses["montant"]
    
    # calcul de la variable attente
    r = []
    last_date = dt.datetime.now()
    for i,row in courses.iterrows():
        days = (row["date_operation"]-last_date).days
        if days == 0:
            r.append(r[-1])
        else:
            r.append(days)
        last_date = row["date_operation"]
    courses["attente"] = r
    courses = courses.iloc[1:,]
    
    # on regroupe les opérations qui ont été effectués à la même date
    # (courses réalisées le même jour mais dans 2 magasins différents)
    a = courses.groupby("date_operation")["montant"].sum()
    b = courses.groupby("date_operation")["attente"].first()
    courses = pd.DataFrame({"montant":a, "attente":b})
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-111-e83bdac1c1d1> in <module>
     14 last_date = dt.datetime.now()
     15 for i,row in courses.iterrows():
    ---> 16days = (row["date_operation"]-last_date).days
     17     if days == 0:
     18         r.append(r[-1])
    
    TypeError: unsupported operand type(s) for -: 'str' and 'datetime.datetime'

    quelqu'un pourrait-il m'aider à résoudre cette erreur. 

    Y'a-t-il un rapport entre le fait que les valeurs de ma colonne 'date_operation' sont au format '2019-05-03'

    tandis que last_date prend ce format

     2019-11-11 15:39:03.550599


    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      11 novembre 2019 à 15:58:26

      Je ne pense pas que ça est un rapport. Ton erreur vient du fait que l'opération row["date_operation"]-last_date n'a pas de sens puisque row["date_operation"] est une chaîne tandis que last_date est de type date. Il faurdait que tu convertisses cette chaîne en son équivalent temporel via un objet de type date.
      • Partager sur Facebook
      • Partager sur Twitter
        11 novembre 2019 à 16:11:14

        Salut, pourtant je reprends tel quel le code du cours... 

        Peux-tu m'indiquer comment coder cette conversion? 

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          11 novembre 2019 à 16:48:01

          RaphaëlBitoun a écrit:

          Peux-tu m'indiquer comment coder cette conversion? 


          Difficilement puisque tu ne dis quel format cela a. Si c'est qq chose du genre '2019-05-03' comme indiqué plus haut, tu split sur '-' et tu construis l'objet date correspondant (tu as le jour, le mois et l'année).
          • Partager sur Facebook
          • Partager sur Twitter
            11 novembre 2019 à 16:49:55

            Je comprends pas, quand je fais 

            type("2019-05-08")

            j'ai bien str. 

            Mais ensuite je ne vois pas trop comment utiliser split pour convertir en date. Il faut utiliser timestamp?

            C'est un peu galère le cours donne le code tel quel sans aucune explication.... 

            J'essaye de rechercher sur internet comment faire mais je ne vois pas trop. J'ai rajouté la ligne 2 mais message d'erreur ... 

            for i,row in courses.iterrows():
                data['date_operation'] = dt.datetime.strptime(data(row['date_operation']), '%Y-%m-%d')
                days = (row['date_operation']-last_date).days
                if days == 0:
                    r.append(r[-1])
                else:
                    r.append(days)
                last_date = row["date_operation"]
            courses["attente"] = r
            courses = courses.iloc[1:,]

             ---------------------------------------------------------------------------

            TypeError                                 Traceback (most recent call last)
            <ipython-input-183-b8f0e6abbb5c> in <module>
             14 last_date = dt.datetime.now()
             15 for i,row in courses.iterrows():
            ---> 16data['date_operation'] = dt.datetime.strptime(data(row['date_operation']), '%Y-%m-%d')
             17     days = (row['date_operation']-last_date).days
             18     if days == 0:
            
            TypeError: 'DataFrame' object is not callable

            Comment est ce que je peux utiliser la fonction split et ensuite dire que le premiere caractère est l'année, le 2ème le mois, et le troisième le jour...? 

            Merci

            -
            Edité par RaphaëlBitoun 11 novembre 2019 à 18:16:35

            • Partager sur Facebook
            • Partager sur Twitter
              11 novembre 2019 à 18:49:35

              RaphaëlBitoun a écrit:

              Comment est ce que je peux utiliser la fonction split et ensuite dire que le premiere caractère est l'année, le 2ème le mois, et le troisième le jour...? 

              Utilisez votre interpréteur

              In [1]: date = '2019-11-12'
              
              In [2]: year, month, day = date.split('-')
              
              In [3]: year
              Out[3]: '2019'
              
              In [4]: month
              Out[4]: '11'
              
              In [5]: day
              Out[5]: '12'
              


              Mais je pense que vous pouvez accéder à ces informations avec l'objet datetime.date...

              -
              Edité par fred1599 11 novembre 2019 à 18:53:21

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                11 novembre 2019 à 19:03:59

                fred vous a montré la méthode pour le faire à la main. J'ai l'impression que votre format est même extractible directement via la méthode de classe fromisoformat (sous Python 3.7)

                -
                Edité par PascalOrtiz 11 novembre 2019 à 19:06:53

                • Partager sur Facebook
                • Partager sur Twitter
                  11 novembre 2019 à 19:07:24

                  OK je vois mais par contre pour le mettre dans ma boucle et qu'ensuite la ligne 

                  days = (row['date_operation']-last_date).days

                  soit bonne je ne vois pas trop.... 

                  Pour ce qui est de fromisoformat il faudrait que  je code 

                  dt.fromisoformat(row['date_operation'])

                  en première ligne de ma boucle ?


                  -
                  Edité par RaphaëlBitoun 11 novembre 2019 à 19:15:02

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 novembre 2019 à 19:46:35

                    Se sont les bases, prenez le temps avec des boucles simples en python, et pourrez vous appuyez sur ces bases pour l'appliquer par la suite.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                      11 novembre 2019 à 19:48:50

                      RaphaëlBitoun a écrit:

                      OK je vois mais par contre pour le mettre dans ma boucle et qu'ensuite la ligne 

                      days = (row['date_operation']-last_date).days

                      soit bonne je ne vois pas trop.... 

                      Pour ce qui est de fromisoformat il faudrait que  je code 

                      dt.fromisoformat(row['date_operation'])

                      en première ligne de ma boucle ?


                      -
                      Edité par RaphaëlBitoun il y a 29 minutes


                      Tu convertis row['date_operation'] en un objet de type date soit à la main comme fred a commencé à t'expliquer soit en faisant date.fromisoformat(row['date_operation']) si tu es sous Python >= 3.7. Tu obtiens alors madate et il te suffit de changer row['date_operation'] par madate dans ta boucle.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 novembre 2019 à 20:32:10

                        Qu'est ce que vous voulez dire par "convertir a la main"?

                         j'essaye de suivre votre méthode avec madate : 

                        # calcul de la variable attente
                        r = []
                        last_date = dt.datetime.now()
                        for i,row in courses.iterrows():
                            ma_date=dt.date.fromisoformat(row['date_operation'])
                            days = (ma_date-last_date).days
                            if days == 0:
                                r.append(r[-1])
                            else:
                                r.append(days)
                            last_date = row["date_operation"]
                        ---------------------------------------------------------------------------
                        TypeError                                 Traceback (most recent call last)
                        <ipython-input-16-945ae25a9688> in <module>
                         15 for i,row in courses.iterrows():
                         16     ma_date=dt.date.fromisoformat(row['date_operation'])
                        ---> 17days = (ma_date-last_date).days
                         18     if days == 0:
                         19         r.append(r[-1])
                        
                        TypeError: unsupported operand type(s) for -: 'datetime.date' and 'datetime.datetime
                        J'essaie de corriger pour qu'il y ait bien dt.datetime pour 'last_date' et 'days' je reviens à mon erreur. 
                        last_date = dt.datetime.now()
                        for i,row in courses.iterrows():
                            ma_date=dt.datetime.fromisoformat(row['date_operation'])
                            days = (ma_date-last_date).days
                            if days == 0:
                                r.append(r[-1])
                            else:
                                r.append(days)
                            last_date = row["date_operation"]
                        courses["attente"] = r
                        courses = courses.iloc[1:,]
                        ---------------------------------------------------------------------------
                        TypeError                                 Traceback (most recent call last)
                        <ipython-input-17-89b210a81e88> in <module>
                         15 for i,row in courses.iterrows():
                         16     ma_date=dt.datetime.fromisoformat(row['date_operation'])
                        ---> 17days = (ma_date-last_date).days
                         18     if days == 0:
                         19         r.append(r[-1])
                        
                        TypeError: unsupported operand type(s) for -: 'datetime.datetime' and 'str'

                        Le contraire pour pour avoir datetime.date de deux cotés...

                        last_date = dt.date.now()
                        for i,row in courses.iterrows():
                            ma_date=dt.date.fromisoformat(row['date_operation'])
                            days = (ma_date-last_date).days
                        ---------------------------------------------------------------------------
                        AttributeError                            Traceback (most recent call last)
                        <ipython-input-22-dc5ec4867e77> in <module>
                         12 # calcul de la variable attente
                         13 r = []
                        ---> 14last_date = dt.date.now()
                         15 for i,row in courses.iterrows():
                         16     ma_date=dt.date.fromisoformat(row['date_operation'])
                        
                        AttributeError: type object 'datetime.date' has no attribute 'now'
                        last_date = dt.date.today()
                        for i,row in courses.iterrows():
                            ma_date=dt.date.fromisoformat(row['date_operation'])
                            days = (ma_date-last_date).days
                            if days == 0:
                                r.append(r[-1])
                        ---------------------------------------------------------------------------
                        TypeError                                 Traceback (most recent call last)
                        <ipython-input-23-679fffe108a0> in <module>
                         15 for i,row in courses.iterrows():
                         16     ma_date=dt.date.fromisoformat(row['date_operation'])
                        ---> 17days = (ma_date-last_date).days
                         18     if days == 0:
                         19         r.append(r[-1])
                        
                        TypeError: unsupported operand type(s) for -: 'datetime.date' and 'str'
                        
                        Est ce que j'ai bien codé ce dont tu me parles avec 'madate' où je suis à côté??
                        Et dans le message d'erreur TypeError: unsupported operand type(s) for -: 'datetime.date' and 'str'
                        est ce que datetime.date correspond à ma_date et str à last_date, c'est dans l'ordre de valeurs dans la parenthèse?
                        Merci pour vos message, c'est pas évident d'apprendre à distance 



                        J'ai également essayé avec .strptime 

                        last_date = dt.datetime.today()
                        for i,row in courses.iterrows():
                            ma_date=dt.datetime.strptime(row['date_operation'],'-')
                            days = (ma_date-last_date).days
                            if days == 0:
                                r.append(r[-1])
                        ---------------------------------------------------------------------------
                        ValueError                                Traceback (most recent call last)
                        <ipython-input-33-f63ac334cd54> in <module>
                         14 last_date = dt.datetime.today()
                         15 for i,row in courses.iterrows():
                        ---> 16ma_date=dt.datetime.strptime(row['date_operation'],'-')
                         17     days = (ma_date-last_date).days
                         18     if days == 0:
                        
                        ~\Anaconda3\lib\_strptime.py in _strptime_datetime(cls, data_string, format)
                         575     """Return a class cls instance based on the input string and the
                         576     format string."""
                        --> 577tt, fraction, gmtoff_fraction = _strptime(data_string, format)
                         578     tzname, gmtoff = tt[-2:]
                         579     args = tt[:6] + (fraction,)
                        
                        ~\Anaconda3\lib\_strptime.py in _strptime(data_string, format)
                         357     if not found:
                         358         raise ValueError("time data %r does not match format %r" %
                        --> 359 (data_string, format))  360     if len(data_string) != found.end():
                         361         raise ValueError("unconverted data remains: %s" %
                        
                        ValueError: time data '2019-05-15' does not match format '-'



                        -
                        Edité par RaphaëlBitoun 11 novembre 2019 à 20:41:40

                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 novembre 2019 à 22:43:51

                          Ceci fonctionne sous Python 3.7 :

                          from datetime import date
                          date_string='2019-05-03'
                          today=(date.today())
                          my_date=date.fromisoformat(date_string)
                          delta=today-my_date
                          print(delta.days)
                          192




                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 novembre 2019 à 14:58:17 - Message modéré pour le motif suivant : Toute forme de publicité est interdite


                              13 novembre 2019 à 14:58:37

                              Bonjour, 

                              Je comprends ton code mais j'ai un peu du mal à le retranscrire dans ma boucle . 

                              # calcul de la variable attente
                              r = []
                              last_date = (dt.date.today())
                              for i,row in courses.iterrows():
                                  my_date=dt.date.fromisoformat(row['date_operation'])
                                  days= (my_date - last_date).days
                                  if days == 0:
                                      r.append(r[-1])
                                  else:
                                      r.append(days)
                                  last_date = row["date_operation"]
                              ---------------------------------------------------------------------------
                              TypeError                                 Traceback (most recent call last)
                              <ipython-input-7-ede5161aa617> in <module>
                               15 for i,row in courses.iterrows():
                               16     my_date=dt.date.fromisoformat(row['date_operation'])
                              ---> 17days= (my_date - last_date).days
                               18     if days == 0:
                               19         r.append(r[-1])
                              
                              TypeError: unsupported operand type(s) for -: 'datetime.date' and 'str'
                              

                              J'ai du louper quelque chose mais je ne vois pas trop...

                              # calcul de la variable attente
                              r = []
                              last_date = (dt.date.today())
                              for i,row in courses.iterrows():
                                  date_string = (row['date_operation'])
                                  my_date=dt.date.fromisoformat(date_string)
                                  days= (my_date - last_date).days
                                  if days == 0:
                                      r.append(r[-1])
                                  else:
                                      r.append(days)
                                  last_date = row["date_operation"]
                              courses["attente"] = r
                              courses = courses.iloc[1:,]
                              
                              ---------------------------------------------------------------------------
                              TypeError                                 Traceback (most recent call last)
                              <ipython-input-21-e9e3066f0fd5> in <module>
                               16     date_string = (row['date_operation'])
                               17     my_date=dt.date.fromisoformat(date_string)
                              ---> 18days= (my_date - last_date).days
                               19     if days == 0:
                               20         r.append(r[-1])
                              
                              TypeError: unsupported operand type(s) for -: 'datetime.date' and 'str'

                              -
                              Edité par RaphaëlBitoun 13 novembre 2019 à 15:09:06

                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 novembre 2019 à 15:37:25

                                Fait un print(row['date_operation']) et regarde si ça respecte bien la forme de chaîne que demande fromisoformat dans la doc ?
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                  13 novembre 2019 à 16:44:16

                                  Quand je fais : 

                                  import pandas as pd
                                  import matplotlib.pyplot as plt
                                  import datetime as dt
                                  data=pd.read_csv('C:/Users/Barbara/Desktop/Raph/MOOC/nettoyer_jeu_donnees/operations_enrichies.csv')
                                  # Selection du sous-échantillon
                                  courses = data[data.categ == "COURSES"]
                                  
                                  # On trie les opérations par date
                                  courses = courses.sort_values("date_operation")
                                  
                                  # On ramène les montants en positif
                                  courses["montant"] = -courses["montant"]
                                  
                                  for i,row in courses.iterrows():
                                      print(row['date_operation'])
                                  2019-05-15
                                  2019-05-17
                                  2019-05-27
                                  2019-05-31
                                  2019-06-03
                                  2019-06-06
                                  2019-06-06
                                  2019-07-09
                                  2019-07-16
                                  2019-07-17
                                  2019-07-22
                                  2019-07-22
                                  2019-07-27
                                  2019-08-05
                                  2019-08-11
                                  2019-08-14
                                  2019-08-19
                                  2019-08-24
                                  2019-09-08
                                  2019-09-11
                                  2019-09-12
                                  2019-09-22
                                  2019-09-28
                                  2019-10-04
                                  2019-10-07
                                  donc bien au format pour convertir à l'aide de date.fromisoformat. Seulement quand j'essaye de rajouter la ligne :
                                  for i, row in courses.iterrows():
                                      my_date = dt.date.fromisoformat(row['date_operation'])
                                      print(my_date)
                                  J'ai la même sortie : 
                                  2019-05-15
                                  2019-05-17
                                  2019-05-27
                                  2019-05-31
                                  2019-06-03
                                  2019-06-06
                                  2019-06-06
                                  2019-07-09
                                  2019-07-16
                                  2019-07-17
                                  2019-07-22
                                  2019-07-22
                                  2019-07-27
                                  2019-08-05
                                  2019-08-11
                                  2019-08-14
                                  2019-08-19
                                  2019-08-24
                                  2019-09-08
                                  2019-09-11
                                  2019-09-12
                                  2019-09-22
                                  2019-09-28
                                  2019-10-04
                                  2019-10-07
                                  Et quand je regarde le format de last_date : 
                                  last_date = (dt.date.today())
                                  print(last_date)
                                  
                                  for i, row in courses.iterrows():
                                      my_date = dt.date.fromisoformat(row['date_operation'])
                                      print(my_date)
                                  2019-11-13
                                  2019-05-15
                                  2019-05-17
                                  2019-05-27
                                  2019-05-31
                                  2019-06-03
                                  2019-06-06
                                  2019-06-06
                                  2019-07-09
                                  2019-07-16
                                  2019-07-17
                                  2019-07-22
                                  2019-07-22
                                  2019-07-27
                                  2019-08-05
                                  2019-08-11
                                  2019-08-14
                                  2019-08-19
                                  2019-08-24
                                  2019-09-08
                                  2019-09-11
                                  2019-09-12
                                  2019-09-22
                                  2019-09-28
                                  2019-10-04
                                  2019-10-07
                                  Il me semble bien que c'est le même format non? 
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 novembre 2019 à 16:44:34

                                    La chaîne indiquée dans l'erreur vient en fait de ta ligne 11.

                                    EDIT : Je fais allusion à ça :

                                    # calcul de la variable attente
                                    r = []
                                    last_date = (dt.date.today())
                                    for i,row in courses.iterrows():
                                        my_date=dt.date.fromisoformat(row['date_operation'])
                                        days= (my_date - last_date).days
                                        if days == 0:
                                            r.append(r[-1])
                                        else:
                                            r.append(days)
                                        last_date = row["date_operation"]

                                    -
                                    Edité par PascalOrtiz 13 novembre 2019 à 16:46:22

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 novembre 2019 à 16:52:23

                                      Alors là j'y comprends plus rien. 

                                      POurquoi le message d'erreur indique la ligne 

                                      days= (my_date - last_date).days





                                      ---------------------------------------------------------------------------
                                      TypeError                                 Traceback (most recent call last)
                                      <ipython-input-21-e9e3066f0fd5> in <module>
                                       16     date_string = (row['date_operation'])
                                       17     my_date=dt.date.fromisoformat(date_string)
                                      ---> 18days= (my_date - last_date).days
                                       19     if days == 0:
                                       20         r.append(r[-1])
                                      
                                      TypeError: unsupported operand type(s) for -: 'datetime.date' and 'str'
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        13 novembre 2019 à 16:55:32

                                        Parce que dans la boucle tu changes last_date (qui redevient une chaîne d'où l'erreur) alors qu'avant la boucle elle a le bon type.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          13 novembre 2019 à 17:00:30

                                          Ah effectivement je l'ai enlevé de la boucle et cela fonctionne bien 

                                          import datetime as dt
                                          
                                          # Selection du sous-échantillon
                                          courses = data[data.categ == "COURSES"]
                                          
                                          # On trie les opérations par date
                                          courses = courses.sort_values("date_operation")
                                          
                                          # On ramène les montants en positif
                                          courses["montant"] = -courses["montant"]
                                          
                                          # calcul de la variable attente
                                          r = []
                                          last_date = (dt.date.today())
                                          for i,row in courses.iterrows():
                                              date_string = (row['date_operation'])
                                              my_date=dt.date.fromisoformat(date_string)
                                              days= (my_date - last_date).days
                                              if days == 0:
                                                  r.append(r[-1])
                                              else:
                                                  r.append(days)
                                          courses["attente"] = r
                                          courses = courses.iloc[1:,]
                                          
                                          # on regroupe les opérations qui ont été effectués à la même date
                                          # (courses réalisées le même jour mais dans 2 magasins différents)
                                          a = courses.groupby("date_operation")["montant"].sum()
                                          b = courses.groupby("date_operation")["attente"].first()
                                          courses = pd.DataFrame({"montant":a, "attente":b})
                                          courses
                                           montantattente
                                          date_operation  
                                          2019-05-17 1.50 -180
                                          2019-05-27 24.46 -170
                                          2019-05-31 10.58 -166
                                          2019-06-03 4.05 -163
                                          2019-06-06 10.62 -160
                                          2019-07-09 4.28 -127
                                          2019-07-16 2.58 -120
                                          2019-07-17 3.90 -119
                                          2019-07-22 56.36 -114
                                          2019-07-27 7.78 -109
                                          2019-08-05 5.89 -100
                                          2019-08-11 2.90 -94
                                          2019-08-14 10.60 -91
                                          2019-08-19 4.27 -86
                                          2019-08-24 14.26 -81
                                          2019-09-08 12.71 -66
                                          2019-09-11 1.90 -63
                                          2019-09-12 19.04 -62
                                          2019-09-22 12.03 -52
                                          2019-09-28 13.35 -46
                                          2019-10-04 2.35 -40
                                          2019-10-07 18.98 -37
                                          Merci pour votre aide !!
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            13 novembre 2019 à 17:20:24

                                            Il est où ce cours Nettoyer votre jeu de données dont tu parles ?
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            comparaison entre deux dates python

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown