Tiempo promedio para la lista de fecha y hora

Buscando la solución más rápida del problema de tiempo promedio.

Tengo una lista de objetos de fecha y hora. Necesidad de encontrar el valor promedio del tiempo (excluyendo año, mes, día). Aquí está lo que tengo hasta ahora:

import datetime as dtm def avg_time(times): avg = 0 for elem in times: avg += elem.second + 60*elem.minute + 3600*elem.hour avg /= len(times) rez = str(avg/3600) + ' ' + str((avg%3600)/60) + ' ' + str(avg%60) return dtm.datetime.strptime(rez, "%H %M %S") 

Aquí hay una mejor manera de abordar este problema

Generar una muestra de fechas de datos.

 In [28]: i = date_range('20130101',periods=20000000,freq='s') In [29]: i Out[29]:  [2013-01-01 00:00:00, ..., 2013-08-20 11:33:19] Length: 20000000, Freq: S, Timezone: None 

avg 20m veces

 In [30]: %timeit pd.to_timedelta(int((i.hour*3600+i.minute*60+i.second).mean()),unit='s') 1 loops, best of 3: 2.87 s per loop 

El resultado como un timedelta (tenga en cuenta que esto requiere numpy 1.7 y pandas 0.13 para la parte to_timedelta , muy pronto)

 In [31]: pd.to_timedelta(int((i.hour*3600+i.minute*60+i.second).mean()),unit='s') Out[31]: 0 11:59:12 dtype: timedelta64[ns] 

En segundos (esto funcionará para pandas 0.12, numpy> = 1.6).

 In [32]: int((i.hour*3600+i.minute*60+i.second).mean()) Out[32]: 43152 

Estaba buscando lo mismo, pero luego descubrí esto. Una forma muy sencilla de obtener el promedio de la lista de objetos de fecha y hora.

  import datetime #from datetime.datetime import timestamp,fromtimestamp,strftime ----> You can use this as well to remove unnecessary datetime.datetime prefix :) def easyAverage(datetimeList): ----> Func Declaration sumOfTime=sum(map(datetime.datetime.timestamp,datetimeList)) ''' timestamp function changes the datetime object to a unix timestamp sort of a format. So I have used here a map to just change all the datetime object into a unix time stamp form , added them using sum and store them into sum variable. ''' length=len(datetimeList) #----> Self Explanatory averageTimeInTimeStampFormat=datetime.datetime.fromtimestamp(sumOfTime/length) ''' fromtimestamp function returns a datetime object from a unix timestamp. ''' timeInHumanReadableForm=datetime.datetime.strftime(averageTimeInTimeStampFormat,"%H:%M:%S") #----> strftime to change the datetime object to string. return timeInHumanReadableForm 

O puedes hacer todo esto en una línea simple:

  avgTime=datetime.datetime.strftime(datetime.datetime.fromtimestamp(sum(map(datetime.datetime.timestamp,datetimeList))/len(datetimeList)),"%H:%M:%S") 

Aclamaciones,

Al menos usarías sum() con una expresión generadora para crear el número total de segundos:

 from datetime import datetime, date, time def avg_time(datetimes): total = sum(dt.hour * 3600 + dt.minute * 60 + dt.second for dt in datetimes) avg = total / len(datetimes) minutes, seconds = divmod(int(avg), 60) hours, minutes = divmod(minutes, 60) return datetime.combine(date(1900, 1, 1), time(hours, minutes, seconds)) 

Manifestación:

 >>> from datetime import datetime, date, time, timedelta >>> def avg_time(datetimes): ... total = sum(dt.hour * 3600 + dt.minute * 60 + dt.second for dt in datetimes) ... avg = total / len(datetimes) ... minutes, seconds = divmod(int(avg), 60) ... hours, minutes = divmod(minutes, 60) ... return datetime.combine(date(1900, 1, 1), time(hours, minutes, seconds)) ... >>> avg_time([datetime.now(), datetime.now() - timedelta(hours=12)]) datetime.datetime(1900, 1, 1, 7, 13)