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

SebKing Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

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

    0
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    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)
    0
  3. SebKing Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
     

    @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

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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)
      0
  4. SebKing Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
     

    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

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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.

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. SebKing Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
     

    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()
    
    
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

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

      0
  7. SebKing
     

    Bonjour,

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

    transactions = pd.read_csv(‘transactions’)

    c’est la ligne manquante.

    en te remerciant 

    0
  8. orvetin
     

    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...

    0
    1. Utilisateur anonyme
       

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

      voilà qui est constructif....

      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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.
       

      0
  9. SebKing Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
     

    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

    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

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

      0