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 medir el tiempo transcurrido entre dos eventos en Python?

Necesito ayuda con esta situación (por cierto, soy nuevo en python y esta es mi primera pregunta): Estoy creando indicadores automáticos utilizando APIs. Clasifico eventos en diferentes categorías, algo así como:

def process():
    df=pd.DataFrame(pd.read_excel(x.xlsx))

    speed = df['speed']
    status = []

    for sp in speed:
        if sp <= 5:
            status.append('stopped')
        elif speed <= 40 and speed > 5:
            status.append('movimiento lento')
        elif speed <= 90 and speed > 40:
            status.append('movimiento normal')

El problema es que realizo una nueva consulta a la API una vez por hora, por lo que esa información está cambiando. Lo que necesito hacer es medir el tiempo que ha pasado entre dos consultas. En otras palabras, si en algún momento un valor es igual a ‘stopped’, quiero saber cuánto tiempo ha tenido esa clasificación ese valor. He intentado algo como esto:

data['timeNow'] = time.time()

for stat in data['status']:
    if stat == 'stopped':
        data['endTime'] = time.time()
        data['timePassed'] = data['endTime'] - data['timeNow']

data['cumulatedTime'] = data['timePassed']

Pero el problema con esto es que es estático.

¿Alguna idea?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución podría ser llevar un registro del tiempo para cada cambio de estado de evento usando un diccionario. Por ejemplo, podrías crear un diccionario llamado statusChangeTime que mapee cada estado con el tiempo en que fue cambiado por última vez:

    statusChangeTime = {'stopped': time.time(), 'slow movement': time.time(), 'normal movement': time.time()}
    

    Luego, en tu función process(), podrías actualizar el diccionario statusChangeTime cada vez que se cambie un estado:

    for i, sp in enumerate(speed):
        if sp <= 5:
            status[i] = 'stopped'
        elif sp <= 40:
            status[i] = 'slow movement'
        elif sp <= 90:
            status[i] = 'normal movement'
    
        # actualizar tiempo de cambio de estado
        if status[i] != status[i-1]:  # el estado ha cambiado
            statusChangeTime[status[i]] = time.time()
    

    Ahora puedes calcular el tiempo transcurrido para cada estado restándole el tiempo del último cambio de estado al tiempo actual:

    data['cumulatedTime'] = 0  # inicializar
    for i, stat in enumerate(data['status']):
        if stat == 'stopped':
            data['cumulatedTime'][i] = time.time() - statusChangeTime['stopped']
        elif stat == 'slow movement':
            data['cumulatedTime'][i] = time.time() - statusChangeTime['slow movement']
        elif stat == 'normal movement':
            data['cumulatedTime'][i] = time.time() - statusChangeTime['normal movement']
    

    De esta manera, la columna cumulatedTime se actualizará dinámicamente a medida que cambie el estado, brindándote el tiempo transcurrido entre cada cambio de estado.

Comments are closed.