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

Fermé
SebKing Messages postés 6 Date d'inscription samedi 9 juillet 2022 Statut Membre Dernière intervention 1 novembre 2022 - 9 juil. 2022 à 11:40
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 11 juil. 2022 à 10:29

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

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
9 juil. 2022 à 11:49

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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 9 juil. 2022 à 12:57

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
SebKing Messages postés 6 Date d'inscription samedi 9 juillet 2022 Statut Membre Dernière intervention 1 novembre 2022
9 juil. 2022 à 22:19

@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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
9 juil. 2022 à 22:31

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
SebKing Messages postés 6 Date d'inscription samedi 9 juillet 2022 Statut Membre Dernière intervention 1 novembre 2022
9 juil. 2022 à 22:54

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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
9 juil. 2022 à 22:57

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

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

Posez votre question
SebKing Messages postés 6 Date d'inscription samedi 9 juillet 2022 Statut Membre Dernière intervention 1 novembre 2022
9 juil. 2022 à 23:21

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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
10 juil. 2022 à 08:21

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

0

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
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
10 juil. 2022 à 10:36
0

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
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 931
10 juil. 2022 à 14:18

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

voilà qui est constructif....

0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 10 juil. 2022 à 14:50

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
SebKing Messages postés 6 Date d'inscription samedi 9 juillet 2022 Statut Membre Dernière intervention 1 novembre 2022
11 juil. 2022 à 09:55

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
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
11 juil. 2022 à 10:29

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

0