[Pandas] Duplicar/Insertar filas en un DataFrame en base a Condiciones

2,630 views
Skip to first unread message

Patricio Del Boca

unread,
Mar 10, 2015, 11:26:45 AM3/10/15
to sci...@googlegroups.com
Gente,

Estoy utilizando Pandas para leer un archivo de eventos y tengo el siguiente problema.

El archivo guarda cantidad de eventos por rango de hora para una fecha dada:


El rango es de una hora para el 80% de los casos.

Hay otros casos en donde entre hora y horafin hay más de una hora de diferencia. Estoy necesitando normalizar esos casos de forma que todas las filas de mi DataFrame tengan un rango de 1 hora. Por ejemplo:



Estoy medio perdido en la forma en la que debo encarar esta tarea. Por lo pronto estoy renegando con algunos for anidados pero me parece que estoy mandando fruta. Quizá con apply() o alguna función parecida se pueda hacer algo más prolijo.

Alguien se topó con algún problema parecido? Alguien podría indicarme si hay alguna función y/o método para encarar este tipo de problemas problema?

Saludos,
--
Patricio Del Boca
Ingeniero en Sistemas de Información - CSM

Javier Burroni

unread,
Mar 10, 2015, 12:30:02 PM3/10/15
to sci...@googlegroups.com
lo primero que haría es sumar la fecha a hora y horafin. De esta forma te evitas tener problemas con las horas cercanas a las 12 de la noche.
Después, podés correr este código. No es lo mas rápido del mundo, pero soluciona el problema
df de ejemplo:
hora = [datetime.datetime.today(), datetime.datetime.today() +  datetime.timedelta(hours=10)]
horafin = [h + datetime.timedelta(hours=4) for h in hora]
cantidad = [400, 800]
df = pd.DataFrame({'hora' : hora, \
                   'horafin' : horafin,\
                   'cantidad' :cantidad})
df
cantidadhorahorafin
04002015-03-10 13:07:18.1052972015-03-10 17:07:18.105297
18002015-03-10 23:07:18.1053072015-03-11 03:07:18.105307

codigo posta
dfs = []
for idx, x in df.iterrows():
    hourX = pd.date_range(start=x.hora, end=x.horafin-datetime.timedelta(hours=1), freq='H')
    df2 = pd.DataFrame({'hour' : hourX})
    df2['cantidad'] = x.cantidad/float(hourX.size)
    df2['horafin'] = df2.hour + datetime.timedelta(hours=1)
    dfs.append(df2)
pd.concat(dfs)

hourcantidadhorafin
02015-03-10 13:07:18.1052971002015-03-10 14:07:18.105297
12015-03-10 14:07:18.1052971002015-03-10 15:07:18.105297
22015-03-10 15:07:18.1052971002015-03-10 16:07:18.105297
32015-03-10 16:07:18.1052971002015-03-10 17:07:18.105297
02015-03-10 23:07:18.1053072002015-03-11 00:07:18.105307
12015-03-11 00:07:18.1053072002015-03-11 01:07:18.105307
22015-03-11 01:07:18.1053072002015-03-11 02:07:18.105307
32015-03-11 02:07:18.1053072002015-03-11 03:07:18.105307


saludos
jb






--
You received this message because you are subscribed to the Google Groups "SciPy Latin America" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scipyla+u...@googlegroups.com.
To post to this group, send email to sci...@googlegroups.com.
Visit this group at http://groups.google.com/group/scipyla.
For more options, visit https://groups.google.com/d/optout.



--
" To be is to do " ( Socrates )
" To be or not to be " ( Shakespeare )
" To do is to be " ( Sartre )
" Do be do be do " ( Sinatra )

Patricio Del Boca

unread,
Mar 10, 2015, 1:09:55 PM3/10/15
to sci...@googlegroups.com
Gracias jb! 

Veo de implementarlo de esa forma y ver que sale =)

Saludos,
Reply all
Reply to author
Forward
0 new messages