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.

¿Cómo capturar datos dentro de un marco de tiempo determinado basado en un intervalo de una hora?

Sigo aprendiendo Python y a veces mi código no es muy eficiente. Estoy buscando una forma más eficiente de agrupar adecuadamente los datos de entrada por “hora”. Esto es para medir la producción cada hora, no un promedio de la producción por hora (Sí, sé que esto sería mucho más simple). Para dar un ejemplo, si hice algo 32 veces entre las 4:30-5:30 y entre las 5:30-6:30 hice 58 y eso fue todo para el día, estos dos períodos de tiempo no serían un promedio de producción por hora, sino que se mantendrían estáticos, que es lo que necesito. Los períodos de tiempo en los que debe encajar son (4:30-5:30, 5:30-6:30, 6:30-7:30, 7:30-8:30, 8:30-9:30, 9:30-10:30, 11:00-12:00, 12:00-1:00, 1:00-2:00, 2:00-3:00, 3:00-4:00, 4:00-5:00, 5:00-6:00, 6:00-7:00, 7:30-8:30, 8:30-9:30, 9:30-10:30, 10:30-11:30, 11:30-12:30, 12:30-1:30). Ya tengo una interfaz gráfica de usuario para ingresar datos en Excel. Tengo dos columnas etiquetadas como “Time” y “Date”, Time es donde manipulo la hora y los minutos.

alist = [2,3,4,5,6,7,8,9,10,11]
blist = [11,12,13,14,15,16,17,18,19]
c_list = [19,20,21,22,23,0]
date = dt.datetime.now()

hm =  float(date.strftime('%H.%M'))

hour = float(date.strftime('%H'))

hour = float(5) #testing
hm =  float(5.30) #testing
for i in alist:
    if hour in alist:
        if hour < 5:
            hour = 5
            a = "{:.2f}".format(hour) 
            print(f'Test 1:{a}')
            break
        if hour+.5 >= 5.5 and hour <10:
            if hm >= hour +.3:
                a = "{:.2f}".format(hour+1)
                print(f'Test 2: {a}')
            else: 
                a = "{:.2f}".format(hour) 
                print(f'Test 3: {a}')
        if hour >= 10: 
            hour = 10
            a = "{:.2f}".format(hour)
            print(f'Test 4: {a}')
    break

Aún no he añadido ningún código para la otra lista. Estoy buscando mejores ideas que las que tengo aquí. Pensé en rangos de fechas pero podría complicarse. Aquí hay una imagen de referencia de dos de las columnas:

Imagen 1

Imagen 2

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Un enfoque posible podría ser usar pandas para agrupar las entradas por hora y luego calcular la suma de producción dentro de cada hora. Aquí hay un código de ejemplo que demuestra este enfoque:

    import pandas as pd
    
    # Cargar datos desde el archivo de Excel
    df = pd.read_excel("data.xlsx")
    
    # Convertir la columna de tiempo al formato datetime y extraer la hora
    df["Time"] = pd.to_datetime(df["Time"]).dt.hour
    
    # Definir la asignación de rangos de hora a etiquetas
    hour_ranges = [(4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), 
                   (11, 12), (12, 13), (13, 14), (14, 15), (15, 16),
                   (16, 17), (17, 18), (18, 19), (19, 20), (20, 21),
                   (21, 22), (22, 23), (23, 24), (0, 1), (1, 2)]
    hour_labels = [f"{r[0]}:00-{r[1]}:00" for r in hour_ranges]
    
    # Agrupar los datos por hora y calcular la suma de producción dentro de cada hora
    df_grouped = df.groupby("Time").sum()
    df_grouped.index = pd.cut(df_grouped.index, [r[0] for r in hour_ranges] + [hour_ranges[-1][1]], right=False, labels=hour_labels)
    
    # Restablecer el índice para crear columnas para Tiempo y Producción
    df_grouped = df_grouped.reset_index()
    
    # Convertir la columna de Tiempo de nuevo al formato de cadena
    df_grouped["Time"] = df_grouped["Time"].astype(str)
    
    # Imprimir el resultado
    print(df_grouped)
    

    Este código asume que los datos de su archivo de Excel se almacenan en un archivo llamado data.xlsx y contiene columnas con los nombres Time y Production. El código lee los datos usando pandas, convierte la columna Time al formato datetime y extrae la hora, define una lista de rangos de horas y sus etiquetas correspondientes, agrupa los datos por hora y calcula la suma de producción dentro de cada hora, asigna los índices de hora a etiquetas de hora, restablece el índice para crear columnas para Time y Production, convierte la columna Time nuevamente al formato de cadena y finalmente imprime el dataframe resultante.

    Tenga en cuenta que este enfoque asume que hay al menos una entrada dentro de cada rango de hora. Si faltan horas, el dataframe resultante tendrá valores NaN para esas horas. Para manejar este caso, podría usar el método reindex de pandas para agregar las horas faltantes con valores de producción igual a 0.

Comments are closed.