获取python中datetime的标准偏差

时间:2013-03-30 15:01:32

标签: python datetime average standard-deviation

我正在我的python程序中导入日期时间库,并且正在进行多个事件的持续时间。以下是我的代码:

d1 = datetime.datetime.strptime(starttime, '%Y-%m-%d:%H:%M:%S')
d2 = datetime.datetime.strptime(endtime, '%Y-%m-%d:%H:%M:%S')
duration = d2 - d1
print str(duration)

现在我在变量“duration”中有一个值。输出结果如下:

0:00:15
0:00:15
0:00:15
0:00:15
0:00:15
0:00:05
0:00:05
0:00:05
0:00:05
0:00:05
0:00:10
0:00:10
0:00:10
0:00:10
0:45:22

我想取所有持续时间的标准偏差并确定是否存在异常。例如,00:45:22是一个异常,我想检测到它。如果我知道datetime的格式是什么,我可以这样做,但它似乎不是数字或任何东西..我正在考虑从以下方面拆分值:并使用中间的所有值,但可能会有更好的方式。

想法?

2 个答案:

答案 0 :(得分:3)

你有datetime.timedelta() objects。它们具有.microseconds.seconds.days属性,全部为3个整数。 str()字符串表示形式根据需要表示[D day[s], ][H]H:MM:SS[.UUUUUU],以适合所有存在的值。

可以对这些对象使用简单算术。按预期进行求和和除法工作,例如:

>>> (timedelta(seconds=100) + timedelta(seconds=200)) / 2
datetime.timedelta(0, 150)

不幸的是,你不能将两个时间间隔相乘并计算标准差因此变得棘手(没有偏移的平方)。

相反,我会使用.total_seconds()方法,为您提供从天,秒和微秒值计算的浮点值,然后使用这些值计算标准偏差。

答案 1 :(得分:2)

您获得的持续时间对象是timedelta对象。或者从一个时间戳到另一个时间戳的持续时间。要将它们转换为总微秒数,请使用:

def timedelta_to_microtime(td):
    return abs(td.microseconds + (td.seconds + td.days * 86400) * 1000000)

然后计算标准差:

def calc_std(L):
    n = len(L)
    mean = sum(L) / float(n)
    dev = [x - mean for x in L]
    dev2 = [x*x for x in dev]
    return math.sqrt(sum(dev2) / n) 

所以:

timedeltas = [your timedeltas here..]
microtimes = [timedelta_to_microtime(td) for td in timedeltas]
std = calc_std(microtimes)
print [(td, mstime) 
       for (td, mstime) in zip(timedeltas, microtimes)
       if mstime - std > X]