3

我正在我的 python 程序中导入 datetime 库,并且正在记录多个事件的持续时间。下面是我的代码:

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)

现在我在变量“持续时间”中有一个值。其输出将是:

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 是一个异常,我想检测它。如果我知道日期时间的格式,我可以这样做,但它似乎不是数字或任何东西..我正在考虑将值从 : 拆分出来并使用两者之间的所有值,但可能会有更好的方法。

想法?

4

2 回答 2

5

你有datetime.timedelta()对象。这些具有.microseconds和属性,所有 3 个整数.seconds。字符串表示根据需要表示那些.days以适合所有存在的值。str()[D day[s], ][H]H:MM:SS[.UUUUUU]

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

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

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

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

于 2013-03-30T15:04:07.490 回答
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] 
于 2013-03-30T15:14:35.750 回答