Voici une réponse assez complète. Vous n'avez pas entièrement spécifié le concept d'un seul voyage, donc j'ai pris une estimation. Vous pouvez ajuster le masque ci-dessous pour mieux correspondre à votre propre définition.
# get rid of am/pm and convert to proper datetime
# converts to year 1900 b/c it's not specified, doesn't matter here
df['StTime'] = pd.to_datetime(df.StartTime.str[:-2], format='%H:%M')
df['EndTime'] = pd.to_datetime(df.EndTime.str[:-2], format='%H:%M')
# some of the later processing is easier if you use duration
# instead of arrival time
df['Duration'] = df.EndTime-df.StTime
# get rid of some nuisance variables for clarity
df = df[['CustomerID','Origin','Dest','StTime','Duration','Fare','Type']]
D'abord, nous devons trouver un moyen de regrouper les lignes. Comme ce n'est pas bien spécifié dans la question, je vais regrouper par ID client où Start Times sont dans 1 heure. Notez que pour les voyages trimodaux, cela implique que les heures de début des premier et troisième voyages peuvent différer de plus d'une heure tant que le premier + le deuxième et le deuxième + le tiers sont chacun individuellement de moins d'une heure. Cela semble être une façon naturelle de le faire, mais pour votre cas d'utilisation réel, vous devez ajuster cela pour votre définition désirée. Il y a plusieurs façons de procéder ici.
mask1 = df.StTime - df.StTime.shift(1) <= pd.Timedelta('01:00:00')
mask2 = (df.CustomerID == df.CustomerID.shift(1))
mask = (mask1 & mask2)
Maintenant, nous pouvons utiliser le masque avec cumsum pour générer un tripID:
df['JourneyID'] = 1
df.ix[mask,'JourneyID'] = 0
df['JourneyID'] = df['JourneyID'].cumsum()
df['NumTrips'] = 1
df[['CustomerID','StTime','Fare','JourneyID']]
CustomerID StTime Fare JourneyID
0 A001 1900-01-01 07:30:00 1.5 1
1 A001 1900-01-01 07:50:00 3.5 1
2 A001 1900-01-01 17:10:00 3.5 2
3 A001 1900-01-01 18:10:00 1.5 2
4 A002 1900-01-01 11:30:00 3.0 3
5 A003 1900-01-01 10:23:00 4.0 4
Maintenant, pour chaque colonne juste agréger de manière appropriée:
df2 = df.groupby('JourneyID').agg({ 'Origin' : sum, 'CustomerID' : min,
'Dest' : sum, 'StTime' : min,
'Fare' : sum, 'Duration' : sum,
'Type' : sum, 'NumTrips' : sum })
StTime Dest Origin Fare Duration Type CustomerID NumTrips
JourneyID
1 1900-01-01 07:30:00 BC AB 5 00:55:00 BusTrain A001 2
2 1900-01-01 17:10:00 BA CB 5 01:10:00 TrainBus A001 2
3 1900-01-01 11:30:00 Y K 3 01:00:00 Train A002 1
4 1900-01-01 10:23:00 O P 4 00:50:00 Ferrie A003 1
Notez que Durée comprend seulement le temps de Voyage et non l'intervalle entre deux voyages (par exemple, si l'heure de début du second voyage est postérieure à l'heure de fin du premier voyage).
Etes-vous sûr de vouloir définir le parcours comme un ensemble de trajets qui se déroulent en moins d'une heure, et non la journée entière qui commence/se termine à la maison? – ako
oui ... voyages tombant dans une heure –
Consultez ces réponses [pandas-combination-rows-based-on-dates] (http://stackoverflow.com/questions/33264676/pandas-combining-rows-based-on -dates) et [how-to-combine-records-based-on-date] (http://stackoverflow.com/questions/35188840/how-to-combine-records-based-on-date-using-python- composants connectés/35193894 # 35193894) – RootTwo