Pandas duplican filas con secuencia de tiempo

Estoy tratando de duplicar las filas del dataframe de mis pandas y también estoy agregando una columna adicional para una secuencia de tiempo en minutos entre la columna FROM y TO .

Por ejemplo, tengo este dataframe.

 ID FROM TO A 15:30 15:33 B 16:40 16:44 C 15:20 15:22 

Lo que quiero que sea la salida es

 ID FROM TO time A 15:30 15:33 15:30 A 15:30 15:33 15:31 A 15:30 15:33 15:32 A 15:30 15:33 15:33 B 16:40 16:41 16:40 B 16:40 16:41 16:41 C 15:20 15:22 15:20 C 15:20 15:22 15:21 C 15:20 15:22 15:22 

En R , podría hacer esto: new_df = setDT(df)[, .(ID, FROM, TO, time=seq(FROM,TO,by="mins")), by=1:nrow(df)] , pero estoy teniendo problemas para encontrar el equivalente Python de esto.

¡Gracias de antemano!

Dos pasos para resolver tu problema:

pd.date_range con apply y strftime

 df['duration'] = df.apply( lambda row: [ i.strftime('%H:%M') for i in pd.date_range( row['FROM'], row['TO'], freq='60s' ) ], axis=1) ID FROM TO duration 0 A 15:30 15:33 [15:30, 15:31, 15:32, 15:33] 1 B 16:40 16:44 [16:40, 16:41, 16:42, 16:43, 16:44] 2 C 15:20 15:22 [15:20, 15:21, 15:22] 

apply con stack

 df.set_index(['ID', 'FROM', 'TO']) \ .duration.apply(pd.Series) \ .stack().reset_index(level=3, drop=True) \ .reset_index() \ .set_index('ID') # Result FROM TO 0 ID A 15:30 15:33 15:30 A 15:30 15:33 15:31 A 15:30 15:33 15:32 A 15:30 15:33 15:33 B 16:40 16:44 16:40 B 16:40 16:44 16:41 B 16:40 16:44 16:42 B 16:40 16:44 16:43 B 16:40 16:44 16:44 C 15:20 15:22 15:20 C 15:20 15:22 15:21 C 15:20 15:22 15:22 

Aquí hay uno similar al de @chrisz usando concat y iterrows junto con date_range limitado a un solo paso

 df = pd.concat([pd.DataFrame({ 'ID':row.ID, 'FROM': row.FROM, 'TO': row.TO, 'TIME': pd.Series(pd.date_range(row.FROM, row.TO, freq='60s').time).astype(str).str[:5] }) for _, row in df.iterrows()]) TIME FROM ID TO 0 15:30 15:30 A 15:33 1 15:31 15:30 A 15:33 2 15:32 15:30 A 15:33 3 15:33 15:30 A 15:33 0 16:40 16:40 B 16:44 1 16:41 16:40 B 16:44 2 16:42 16:40 B 16:44 3 16:43 16:40 B 16:44 4 16:44 16:40 B 16:44 0 15:20 15:20 C 15:22 1 15:21 15:20 C 15:22 2 15:22 15:20 C 15:22