2011-02-15 11 views
14

He creado una lista de objetos timedelta y necesito obtener el promedio de esta lista. cuando intento hacernecesita el promedio de una lista de objetos timedelta

return (sum(delta_list)/(len(delta_list)-1)) 

me sale TypeError: tipo de operando sin soporte (s) de +: 'int' y 'datetime.timedelta'

Soy nuevo en la utilización de clases pitones de fecha y hora. También me gustaría saber cómo poner este promedio en un formato como días: horas: minutos: no necesito nada más pequeño que minutos.

+4

'Gracias en avanzado'. No agradecer de antemano y olvidarte de agradecer más tarde. Aprende a aceptar tus respuestas – user225312

+0

¿Qué pasa con el código que has publicado? ¿Recibe un error? Por favor, muestra el error que obtienes? –

+0

Olvidé pegarlo, edité la pregunta para incluir el error. – cferbs

Respuesta

25

sum quiere un valor de partida, que es 0 por defecto, pero 0 no se puede añadir a un timedelta para que pueda obtener el error.

sólo hay que dar sum un timedelta() como valor inicial:

# this is the average 
return sum(delta_list, timedelta())/len(delta_list) 

imprimirlo usted puede hacer esto:

print str(some_delta) 

Si quieres algo modificado para requisitos particulares usted puede conseguir some_delta.days y some_delta.seconds pero tienes que calcular todo entre.

+0

@cferbs: Sí, es correcto, para obtener el promedio que usted hace 'sum (..)/len (..)' –

+0

¡Gracias que funcionó! – cferbs

+0

En Python 3.3 asegúrese de utilizar el operador '//': –

2

Un objeto datetime.timedelta tiene atributos para acceder a los días, microsegundos y segundos. Puede hacer referencia a ellos fácilmente, por ejemplo:

>>> import datetime 
>>> daybefore = datetime.timedelta(days=1) 
>>> dayminus2 = datetime.timedelta(days=2, minutes=60) 
>>> daybefore.days 
1 
>>> dayminus2.days, dayminus2.seconds 
(2, 3600) 

Para conseguir minutos que vas a tener que dividir por segundo 60.

3

El sum() function necesita un valor de inicio para añadir todos los elementos de la iterable a . Se establece de manera predeterminada en 0 y es por eso que aparece el error al agregar timedelta a int.

Para solucionar este problema, sólo tiene que pasar un objeto timedelta como segundo argumento a sum:

(Creación de una timedelta sin argumentos crea uno correspondiente a una diferencia de tiempo cero.)

Además, la media de un conjunto de elementos suele ser la suma de elementos divididos por la cantidad de elementos, por lo que no es necesario restar 1 de len(delta_list).

Estos cambios significan que podemos eliminar algunos de los corchetes de su extracto.

lo que este le da:

return sum(delta_list,timedelta())/len(delta_list) 
3

En primer lugar, sum agrega todos los elementos de la lista para un valor inicial, que es por defecto 0 (un entero con valor de cero). Para poder usar sum en una lista de timedelta, necesita pasar un argumento timedelta(0) - sum(delta_list, timedelta(0)).

En segundo lugar, ¿por qué quiere restar uno de la longitud de la lista? Si una lista es de longitud 1 obtendrá un ZeroDivisionError.

Habiendo arreglado lo anterior, terminará con un objeto timedelta siendo un promedio. Cómo convertir eso a un formato legible para los humanos, lo dejo como ejercicio. El datetime module documentation debe responder todas las preguntas posibles.

+0

Me di cuenta de que estaba mal. Me confundí de otro código de ejemplo de http://stackoverflow.com/questions/179716/average-difference-between-dates-in-python – cferbs

Cuestiones relacionadas