我正在我的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的格式是什么,我可以这样做,但它似乎不是数字或任何东西..我正在考虑从以下方面拆分值:并使用中间的所有值,但可能会有更好的方式。
想法?
答案 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]