Python calcul d'une durée de connexion à partir de 2 col

Bonjour,

Je dois calculer un temps de connexion pour chaque personne à partir de 2 colonnes d'un DataFrame.

Pour cela j'ai écris le code suivant:

#importation des packages nécessaires au calcul des durées

import datetime
from datetime import timedelta

#Analyse de la variable du temps de connexion
#Step_1 stockage des données dans 2 variables: time_1 et time_2
time_1 = transactions['signup_time']
print(time_1.head())
time_2 = transactions['purchase_time']
print(time_2.head())

#calcul des durées de connexion entre signup_time et purchase_time
#calcul de la durée de connexion à partir de la différence entre time_1 et time_2

myDateTime1 = datetime.datetime(time_1)
myDateTime2 = datetime.datetime(time_2)
delta_time = myDateTime2 - myDateTime1

#ajouter une colonne dans le dataframe pour la durée de connexion
transactions.insert("connected_time", valeurs)
transactions.head()

Cependant je reçois le message d'erreur suivant:

TypeError                                 Traceback (most recent call last)
/var/folders/8l/ntsj_13s12x97qhbjly0xdkr0000gn/T/ipykernel_17005/4095553184.py in <module>
     14 #calcul de la durée de connexion à partir de la différence entre time_1 et time_2
     15 datetime.timedelta
---> 16 myDateTime1 = datetime.datetime(time_1)
     17 myDateTime2 = datetime.datetime(time_2)
     18 delta_time = myDateTime2 - myDateTime1

~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/series.py in wrapper(self)
    183         if len(self) == 1:
    184             return converter(self.iloc[0])
--> 185         raise TypeError(f"cannot convert the series to {converter}")
    186 
    187     wrapper.__name__ = f"__{converter.__name__}__"

TypeError: cannot convert the series to <class 'int'>

Du coup, manquant d'expérience en langage Python, je pensais que le format:

2015-02-24 22:55:49

était adapté aux calculs avec datetime et timedelta

Si quelqu'un pouvait m'aider à avancer 

En vous remerciant par avance

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur

    bonjour,

    il serait préférable de partager un exemple que nous puissions tester.

    Peux-tu ajouter

    print (type(time_1), time_1)

    Que contiendra "valeurs"? 

    1. Contributeur

      suggestion:

      def td(x):
          f="%Y-%m-%d %H:%M:%S"
          return datetime.datetime.strptime(x['purchase_time'],f)- \
                 datetime.datetime.strptime(x['signup_time'],f)
      transactions["connected_time"].apply(td,axis=1)
      1. @yg_be 

        Merci pour tes réponses et suggestions,

        Valeurs est initialement destiné à enregistrer(sous la forme d'une colonne d'un DataFrame) les valeurs issues de la différence entre signup_time et purchase_time.

        En suivant ta suggestion j'obtiens le message suivant: 

        KeyError: 'connected_time'

        Je pense qu'il faut que je définisse 'connecter_time' en amont 

        En fait signup_time et purchase_time sont dtype: object

        1. Contributeur

          Il serait préférable de partager un exemple complet, simplifié, que nous puissions tester.

          Tu ne précises même pas ce qu'est précisément "transactions".

          exemple:

          import pandas as pd
          import datetime
          def td(x):
              f="%Y-%m-%d %H:%M:%S"
              return datetime.datetime.strptime(x['purchase_time'],f)- \
                     datetime.datetime.strptime(x['signup_time'],f)
          t="2015-02-24 22:55:49"
          transactions = pd.DataFrame({'purchase_time': [t,t,t],'signup_time': [t,t,t]})
          print(transactions)
          transactions['c3'] = transactions.apply(td,axis=1)
          print(transactions)
      2. Merci pour ta réponse. transactions est un DataFrame issu d'un fichier csv

        Voici une partie des données

        user_id    signup_time    purchase_time    purchase_value    device_id    source    browser    sex    age    ip_address
        22058    2015-02-24 22:55:49    2015-04-18 2:47:11    34    QVPSPJUOCKZAR    SEO    Chrome    M    39    732758368.8
        333320    2015-06-07 20:39:50    2015-06-08 1:38:54    16    EOGFQPIZPYXFZ    Ads    Chrome    F    53    350311387.9
        1359    2015-01-01 18:52:44    2015-01-01 18:52:45    15    YSSKYOSJHPPLJ    SEO    Opera    M    53    2621473820.0
        150084    2015-04-28 21:13:25    2015-05-04 13:54:50    44    ATGTXKYKUDUQN    SEO    Safari    M    41    3840542444.0
        221365    2015-07-21 7:09:52    2015-09-09 18:40:53    39    NAUITBZFJKHWW    Ads    Safari    M    45    415583117.5
        159135    2015-05-21 6:03:03    2015-07-09 8:05:14    42    ALEYXFXINSXLZ    Ads    Chrome    M    18    2809315200.0
        50116    2015-08-01 22:40:52    2015-08-27 3:37:57    11    IWKVZHJOCLPUR    Ads    Chrome    F    19    3987484329.0
        360585    2015-04-06 7:35:45    2015-05-25 17:21:14    27    HPUCUYLMJBYFW    Ads    Opera    M    34    1692458728.0
        159045    2015-04-21 23:38:34    2015-06-02 14:01:54    30    ILXYDOZIHOOHT    SEO    IE    F    43    3719094257.0
        182338    2015-01-25 17:49:49    2015-03-23 23:05:42    62    NRFFPPHZYFUVC    Ads    IE    M    31    341674739.6
        199700    2015-07-11 18:26:54    2015-10-28 21:59:40    13    TEPSJVVXGNTYR    Ads    Safari    F    35    1819008578.0
        73884    2015-05-29 16:22:02    2015-06-16 5:45:58    58    ZTZZJUCRDOCJZ    Direct    Chrome    M    32    4038284553.0
        79203    2015-06-16 21:19:35    2015-06-21 3:29:59    18    IBPNKSMCKUZWD    SEO    Safari    M    33    4161540927.0
        299320    2015-03-03 19:17:07    2015-04-05 12:32:36    50    RMKQNVEWGTWPC    Direct    Safari    M    38    3178510015.0
        82931    2015-02-16 2:50:30    2015-04-16 0:56:47    15    XKIFNYUZMBWFU    SEO    IE    M    24    4203487754.0
        31383    2015-02-01 1:06:17    2015-03-24 10:17:58    58    UNUAVQXNWFBMO    SEO    Safari    F    24    995732779.0
        78986    2015-05-15 3:52:08    2015-08-11 2:29:47    57    TGHVAWBMZRDHH    SEO    FireFox    M    23    3503883392.0
        119824    2015-03-20 0:31:27    2015-04-05 7:31:46    55    WFIIFCPIOGMHT    Ads    Safari    M    38    131423.789
        357386    2015-02-03 0:48:38    2015-03-24 18:27:23    40    NWSVDOHYIOBDR    Ads    FireFox    M    24    3037372279.0
        289172    2015-07-17 5:48:45    2015-11-12 22:08:11    46    KFZGQIWDIRLZB    Direct    FireFox    F    53    1044590098.0
        154699    2015-07-08 15:35:44    2015-07-20 0:11:52    24    TYZPZLEWNJJRI    Direct    FireFox    F    23    3847612074.0
        316355    2015-08-08 20:05:50    2015-10-03 2:21:46    47    IHGECNGZGQOAZ    SEO    Chrome    M    28    3836794299.0
        343378    2015-01-30 8:50:29    2015-04-22 15:11:45    47    VOMVNRHNBLLMI    SEO    Chrome    F    24    1008390841.0
        370338    2015-01-08 11:47:29    2015-03-29 20:46:44    25    QLMZBEDPYFUXT    Ads    IE    M    34    3442657972.0
        171711    2015-01-11 1:51:15    2015-01-11 1:51:16    52    YPLQGKBAAULUV    Direct    IE    F    35    1120619336.0
        59780    2015-01-04 22:32:33    2015-01-16 1:13:43    31    WUMOBGUCBOXPO    SEO    FireFox    M    36    1752166824.0
        176129    2015-01-28 12:53:51    2015-01-29 23:21:43    37    XUNJIVTRXCRZL    Ads    IE    M    32    745823926.8
        100886    2015-07-12 14:14:04    2015-07-29 7:41:26    54    GIREUSMFWWUZJ    SEO    Chrome    F    28    1799140971.0
        221257    2015-05-29 17:55:17    2015-09-05 22:42:38    12    LGFXOENGXOBXI    SEO    IE    M    19    698700037.4
        151705    2015-01-07 3:44:53    2015-01-07 3:44:54    48    URHCRIXOMLJMH    SEO    Chrome    F    27    2836025221.0
        399610    2015-04-03 20:06:51    2015-06-01 7:42:42    30    CLTWKVSGDCFRD    SEO    FireFox    F    39    287463049.3
        396746    2015-08-05 23:50:35    2015-08-14 12:08:55    56    JUWCOHMHRBDCL    SEO    IE    M    56    2937613755.0
        243817    2015-02-13 18:16:05    2015-04-23 17:44:27    72    YIIEFBZUGEXNR    Direct    Chrome    F    32    2521870760.0
        262245    2015-01-03 3:29:05    2015-02-26 23:23:55    38    YAQQIDVLQRBLL    Ads    IE    F    21    2803457087.0
        256743    2015-06-12 19:11:32    2015-07-11 6:42:08    33    VVZIVFUBISCEV    SEO    IE    M    22    2260745439.0

        1. Contributeur

          Ce n'est pas un problème de données, c'est un problème de type.
          Il serait préférable de partager un programme exemple complet, simplifié, que nous puissions tester.

      3. Ah OK, voici la première version que j'avais tapé:

        import pandas as pd
        import datetime
        from datetime import timedelta
        
        #Analyse de la variable du temps de connexion
        #stockage des données dans 2 variables: time_1 et time_2
        time_1 = transactions['signup_time']
        print(time_1.head())
        time_2 = transactions['purchase_time']
        print(time_2.head())
        print (type(time_1), time_1)
        
        #calcul des durées de connexion entre signup_time et purchase_time
        #calcul de la durée de connexion à partir de la différence entre time_1 et time_2
        
        myDateTime1 = datetime.datetime(time_1)
        myDateTime2 = datetime.datetime(time_2)
        delta_time = myDateTime2 - myDateTime1
        
        #ajouter une colonne dans le dataframe pour la durée de connexion
        transactions.insert("connected_time", valeurs)
        transactions.head()
        
        
        
        1. Contributeur

          Ce code est incomplet, comment transactions est-il créé?

      4. Bonjour,

        En fait transactions est chargé de la manière suivante:

        transactions = pd.read_csv(‘transactions’)

        c’est la ligne manquante.

        en te remerciant 

        1. Bonjour,

          import pandas as pd
          import datetime
          
          transactions = pd.read_csv('LEFICHIER.csv', delimiter='    ', engine='python')
          values= []
          dt_format = '%Y-%m-%d %H:%M:%S'
          for i in range(len(transactions)):
              t1 = transactions['signup_time'][i]
              t2 = transactions['purchase_time'][i]
              dt1 = datetime.datetime.strptime(t1, dt_format)
              dt2 = datetime.datetime.strptime(t2, dt_format)
              values.append(dt2 - dt1)
          
          transactions.insert(column="connected_time", value=values, loc=len(transactions.columns))
          print(transactions.head())

           Il y a peut-être une autre façon de parcourir les lignes avec panda plutôt qu'un range + len, à voir.

          Purée, il craint ce nouveau système ccm...

          1. Purée, il craint ce nouveau système ccm...
             

            voilà qui est constructif....

          2. Contributeur

            et ainsi?

            import pandas as pd
            import datetime
            def td(x):
                f="%Y-%m-%d %H%M%S"
                return datetime.datetime.strptime(x['purchase_time'],f)- \
                       datetime.datetime.strptime(x['signup_time'],f)
            transactions = pd.read_csv("transactions",delimiter='    ', engine='python')
            transactions["connected_time"] = transactions.apply(td,axis=1)
            print(transactions)

            EDIT: j'ai du changer le format de date, suite à des soucis de couper/coller.

            Je ne comprends pas d'où venait le soucis "Key Error" du 9 juil. 2022 à 22:19.
             

        2. Merci beaucoup, il est vrai que le calcul de temps à partir de ce format n'est pas évident me concernant

          Merci pour votre aide dans la résolution et la compréhension de ma question

          Bonne journée

          1. Contributeur

            Le moment venu, peux-tu marquer la discussion comme résolue?