2016-02-20 1 views
1

Actuellement, il fonctionne avec un ensemble de données de cartes à puce de transport intéressant. Chaque ligne dans les données actuelles représente un trajet (par exemple un trajet de bus de A à B). Tout voyage dans les 60 minutes doit être groupé en voyage.Python Python: comment combiner des segments de voyage dans un voyage avec des données de carte à puce de transport

Le tableau actuel:

CustomerID SegmentID Origin Dest StartTime EndTime Fare Type 
0  A001  101  A B 7:30am 7:45am 1.5  Bus 
1  A001  102  B C 7:50am 8:30am 3.5 Train 
2  A001  103  C B 17:10pm 18:00pm 3.5 Train 
3  A001  104  B A 18:10pm 18:30pm 1.5  Bus 
4  A002  105  K Y 11:30am 12:30pm 3.0 Train 
5  A003  106  P O 10:23am 11:13am 4.0 Ferrie 

et secrète en quelque chose comme:

CustomerID JourneyID Origin Dest Start Time End Time Fare  Type NumTrips 
0  A001   1  A C  7:30am 8:30am  5 Intermodal   2 
1  A001   2  C A 17:10pm 18:30pm  5 Intermodal   2 
2  A002   6  K Y 11:30am 12:30pm  3  Train   1 
3  A003   8  P O 10:23am 11:13am  4  Ferrie   1 

Je suis nouveau à Python et Pandas et ne savent pas comment commencer, de sorte que toute orientation serait appréciée .

+0

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

+0

oui ... voyages tombant dans une heure –

+0

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

Répondre

0

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