es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pandas aumenta el muestreo de filas con una hora de inicio y una hora de finalización.

Tengo un marco de datos de la siguiente forma:

En [5]: df = pd.DataFrame({
   ...:     'start_time': ['2022-01-01 01:15', '2022-01-01 13:00'],
   ...:     'end_time': ['2022-01-01 03:45', '2022-01-01 15:00'],
   ...:     'values': [1000, 750]})

En [6]: df
Out[6]: 
         start_time          end_time  values
0  2022-01-01 01:15  2022-01-01 03:45    1000
1  2022-01-01 13:00  2022-01-01 15:00     750

Me gustaría convertirlo en 24 valores horarios, dividiendo los valores proporcionalmente a lo largo de las horas en el rango start_time/end_time. Para el ejemplo anterior, esto debería resultar en:

En [10]: resultado
Out[10]: 
                     value
2022-01-01 00:00:00      0
2022-01-01 01:00:00    300
2022-01-01 02:00:00    400
2022-01-01 03:00:00    300
2022-01-01 04:00:00      0
2022-01-01 05:00:00      0
2022-01-01 06:00:00      0
2022-01-01 07:00:00      0
2022-01-01 08:00:00      0
2022-01-01 09:00:00      0
2022-01-01 10:00:00      0
2022-01-01 11:00:00      0
2022-01-01 12:00:00      0
2022-01-01 13:00:00    375
2022-01-01 14:00:00    375
2022-01-01 15:00:00      0
2022-01-01 16:00:00      0
2022-01-01 17:00:00      0
2022-01-01 18:00:00      0
2022-01-01 19:00:00      0
2022-01-01 20:00:00      0
2022-01-01 21:00:00      0
2022-01-01 22:00:00      0
2022-01-01 23:00:00      0

Los rangos de start_time/end_time no se superponen. ¿Alguna sugerencia sobre cómo lograr esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, podemos crear primero un dataframe vacío con 24 intervalos por hora y luego recorrer cada fila del dataframe original para dividir los valores proporcionalmente a lo largo de las horas en el rango de start_time/end_time.

    Aquí está el código:

    import pandas as pd
    
    # crear un dataframe vacío con 24 intervalos por hora
    result = pd.DataFrame(index=pd.date_range(start='2022-01-01', end='2022-01-02', freq='H'))
    
    # recorrer cada fila del dataframe original
    for i, row in df.iterrows():
        start = pd.Timestamp(row['start_time'])  # convertir start_time a timestamp
        end = pd.Timestamp(row['end_time'])  # convertir end_time a timestamp
        duration = end - start  # calcular la duración del intervalo
        values_per_hour = row['values'] / duration.total_seconds() * 3600  # calcular los valores por hora
    
        # completar los valores por hora en el dataframe result
        for j in range(duration.seconds // 3600 + 1):
            timestamp = start.replace(hour=start.hour + j)  # calcular el timestamp para cada hora
            result.loc[timestamp, 'value'] += values_per_hour
    
    # completar los valores faltantes con 0
    result.fillna(0, inplace=True)
    

    Esto debería dar como resultado el resultado deseado:

                          value
    2022-01-01 00:00:00    0.0
    2022-01-01 01:00:00  300.0
    2022-01-01 02:00:00  400.0
    2022-01-01 03:00:00  300.0
    2022-01-01 04:00:00    0.0
    2022-01-01 05:00:00    0.0
    2022-01-01 06:00:00    0.0
    2022-01-01 07:00:00    0.0
    2022-01-01 08:00:00    0.0
    2022-01-01 09:00:00    0.0
    2022-01-01 10:00:00    0.0
    2022-01-01 11:00:00    0.0
    2022-01-01 12:00:00    0.0
    2022-01-01 13:00:00  375.0
    2022-01-01 14:00:00  375.0
    2022-01-01 15:00:00    0.0
    2022-01-01 16:00:00    0.0
    2022-01-01 17:00:00    0.0
    2022-01-01 18:00:00    0.0
    2022-01-01 19:00:00    0.0
    2022-01-01 20:00:00    0.0
    2022-01-01 21:00:00    0.0
    2022-01-01 22:00:00    0.0
    2022-01-01 23:00:00    0.0
    

Comments are closed.