日期时间列表的平均时间

use*_*556 8 python datetime average pandas

寻找时间平均问题的最快解决方案.

我有一个日期时间对象列表.需要找到时间的平均值(不包括年,月,日).这是我到目前为止所得到的:

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")
Run Code Online (Sandbox Code Playgroud)

wie*_*u_p 6

这是一个简短而甜蜜的解决方案(虽然可能不是最快的)。它获取日期列表中的每个日期与某个任意参考日期之间的差异(返回 datetime.timedelta),然后对这些差异求和并求平均值。然后它添加回原始参考日期。

import datetime
def avg(dates):
  any_reference_date = datetime.datetime(1900, 1, 1)
  return any_reference_date + sum([date - any_reference_date for date in dates], datetime.timedelta()) / len(dates)
Run Code Online (Sandbox Code Playgroud)


Jef*_*eff 5

这是解决此问题的更好方法

生成日期时间的样本

In [28]: i = date_range('20130101',periods=20000000,freq='s')

In [29]: i
Out[29]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 00:00:00, ..., 2013-08-20 11:33:19]
Length: 20000000, Freq: S, Timezone: None
Run Code Online (Sandbox Code Playgroud)

平均20m

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
Run Code Online (Sandbox Code Playgroud)

作为timedelta的结果(注意,这需要numpy 1.7和pandas 0.13的to_timedelta部分,即将推出)

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]
Run Code Online (Sandbox Code Playgroud)

在几秒钟内(这将适用于pandas 0.12,numpy> = 1.6).

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