Remuestreo de una serie temporal de eventos + duración en eventos concurrentes

Tengo dos columnas; la hora en que comenzó un evento y la duración de ese evento. Al igual que:

time, duration 1:22:51,41 1:56:29,36 2:02:06,12 2:32:37,38 2:34:51,24 3:24:07,31 3:28:47,59 3:31:19,32 3:42:52,37 3:57:04,58 4:21:55,23 4:40:28,17 4:52:39,51 4:54:48,26 5:17:06,46 6:08:12,1 6:21:34,12 6:22:48,24 7:04:22,1 7:06:28,46 7:19:12,51 7:19:19,4 7:22:27,27 7:32:25,53 

Quiero crear un gráfico de líneas que muestre la cantidad de eventos simultáneos que ocurren a lo largo del día. Cambiar el nombre de time a start_time y agregar una nueva columna que end_time es bastante fácil (suponiendo que sea el siguiente paso). Lo que no estoy muy seguro de entender es cómo, después, puedo volver a muestrear estos datos para poder registrar los concurrentes.

Me imagino que quiero terminar con algo como (pero baldeo por minuto):

 time, events 1:30:00,1 2:00:00,2 2:30:00,1 3:00:00,1 3:30:00,2 

Primero hazlo como una marca de tiempo real:

 df['time'] = pd.to_datetime('2014-03-14 ' + df['time']) 

Ahora puedes conseguir los tiempos finales:

 df['end_time'] = df['time'] + df['duration'] * pd.offsets.Minute(1) 

Una forma de obtener los eventos abiertos es combinar los tiempos de inicio y finalización, volver a muestrear y acumular:

 In [11]: open = pd.concat([pd.Series(1, df.time), # created add 1 pd.Series(-1, df.end_time) # closed substract 1 ]).resample('30Min', how='sum').cumsum() In [12]: open Out[12]: 2014-03-14 01:00:00 1 2014-03-14 01:30:00 2 2014-03-14 02:00:00 1 2014-03-14 02:30:00 1 2014-03-14 03:00:00 2 2014-03-14 03:30:00 4 2014-03-14 04:00:00 2 2014-03-14 04:30:00 2 2014-03-14 05:00:00 2 2014-03-14 05:30:00 1 2014-03-14 06:00:00 2 2014-03-14 06:30:00 0 2014-03-14 07:00:00 3 2014-03-14 07:30:00 2 2014-03-14 08:00:00 0 Freq: 30T, dtype: int64 

Podría crear una lista que contenga elementos del diccionario con valores “tiempo”, “eventos”

obviamente, necesita manejar la evaluación y manipulación de los tipos de datos de tiempo de manera diferente, pero podría hacer algo como esto:

  event_bucket = [] time_interval = (end_time - start_time) / num_of_buckets for ii in range(num_of_buckets): event_bucket.append({"time":start_time + ii*time_interval,"events":0}) for entry in time_entry: for bucket in event_bucket: if bucket["time"] >= entry["start_time"] and bucket["time"] <= entry["end_time"]: bucket["events"] += 1 

Si num_of_buckets , hará que el gráfico sea más preciso.