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
| cantidad | hora | horafin |
|---|
| 0 | 400 | 2015-03-10 13:07:18.105297 | 2015-03-10 17:07:18.105297 |
|---|
| 1 | 800 | 2015-03-10 23:07:18.105307 | 2015-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)
| hour | cantidad | horafin |
|---|
| 0 | 2015-03-10 13:07:18.105297 | 100 | 2015-03-10 14:07:18.105297 |
|---|
| 1 | 2015-03-10 14:07:18.105297 | 100 | 2015-03-10 15:07:18.105297 |
|---|
| 2 | 2015-03-10 15:07:18.105297 | 100 | 2015-03-10 16:07:18.105297 |
|---|
| 3 | 2015-03-10 16:07:18.105297 | 100 | 2015-03-10 17:07:18.105297 |
|---|
| 0 | 2015-03-10 23:07:18.105307 | 200 | 2015-03-11 00:07:18.105307 |
|---|
| 1 | 2015-03-11 00:07:18.105307 | 200 | 2015-03-11 01:07:18.105307 |
|---|
| 2 | 2015-03-11 01:07:18.105307 | 200 | 2015-03-11 02:07:18.105307 |
|---|
| 3 | 2015-03-11 02:07:18.105307 | 200 | 2015-03-11 03:07:18.105307 |
|---|
saludos
jb