Como partir un segmento de tiempos en slots de una duración determinada


Una de las primeras tareas que tengo que ejecutar en los scripts de gráficos de mercado de energía es bajar información de esios.

lista=[]
for i in segmentos_fechas.index:
    inicio = segmentos_fechas.loc[i,'first'].strftime("%Y-%m-%d")
    fin = segmentos_fechas.loc[i,'last'].strftime("%Y-%m-%d")
    print (f"Descargando desde {inicio}, hasta {fin}")
    lista.append(download_esios(token_esios,indicador,inicio,fin,time_trunc='five_minutes'))

Y para ellos he de indicar, como se puede ver en el código de arriba una fecha de inicio y una fecha final. La API de esios tiene un máximo de registros en la descarga, con lo que no es extraño que tengas que concatenar varias llamadas, uniendo finalmente el resultado de cada una de esas llamadas:

raw = pd.concat(lista, ignore_index=True )

Una de las posibles soluciones es coger el día de ayer (que suele ser el día final), y, por ejemplo restarle sucesivamente 365, 2*365, 3*365…con ello bajamos un año completo en cada llamada. Pero cunado la primera fecha es fija no es una solución muy elegante.

De casualidad encontré esta solución, que me parece muy elegante y muy comoda.

Tan solo hay que añadir fecha inicial, y fecha final y le indicas el máximo de días en cada una de las llamadas:

Primero declaramos el rango entre día inicio y último día, y generamos una Series de Pandas:

rango_fechas = pd.Series(pd.date_range(start='2021-01-01',end=(datetime.today()-timedelta(days=1)).strftime('%Y-%m-%d'),
                                       freq=timedelta(days=1)))

y a continuación generamos un DataFrame de Pandas:

segmentos_fechas = (rango_fechas
 .groupby(np.arange(len(rango_fechas))//30)
 .agg(['first','last'])
)

en el que aparecen dos columnas, con fecha inicio y fecha final, y filas con intervalos de fechas de duración equivalente al máximo de días que hemos indicado, en este caso 30 días :


first	last
0	2021-01-01	2021-01-30
1	2021-01-31	2021-03-01
2	2021-03-02	2021-03-31
3	2021-04-01	2021-04-30
4	2021-05-01	2021-05-30
5	2021-05-31	2021-06-29
6	2021-06-30	2021-07-29
7	2021-07-30	2021-08-28
8	2021-08-29	2021-09-27
9	2021-09-28	2021-10-27
10	2021-10-28	2021-11-26
11	2021-11-27	2021-12-26
12	2021-12-27	2022-01-25
13	2022-01-26	2022-02-24
14	2022-02-25	2022-03-26
15	2022-03-27	2022-04-25
16	2022-04-26	2022-05-25
17	2022-05-26	2022-06-24
18	2022-06-25	2022-07-24
19	2022-07-25	2022-08-23
20	2022-08-24	2022-09-22
21	2022-09-23	2022-10-22
22	2022-10-23	2022-11-21
23	2022-11-22	2022-12-21
24	2022-12-22	2023-01-20
25	2023-01-21	2023-02-19
26	2023-02-20	2023-03-21
27	2023-03-22	2023-04-20
28	2023-04-21	2023-05-20
29	2023-05-21	2023-06-19
30	2023-06-20	2023-07-19
31	2023-07-20	2023-07-29

Ahora ya podemos iterar sin riesgo e ir bajando la información…

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.