【问题标题】:take standard deviation of datetime in python在python中取日期时间的标准差
【发布时间】:2013-03-30 15:01:32
【问题描述】:

我在我的 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)

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

想法?

【问题讨论】:

  • 您正在查看timedelta 对象的字符串表示
  • 您是否尝试过查看datetime documentation
  • 避免使用from datetime import datetimedatetime.datetime

标签: python datetime average standard-deviation


【解决方案1】:

你有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() 方法为您提供一个根据天、秒和微秒值计算得出的浮点值,然后使用这些值计算标准偏差。

【讨论】:

  • 例如,使用numpy.std(total_seconds)
【解决方案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] 

【讨论】:

  • 这里的 X 是什么?是我设定的门槛吗?我希望阈值由标准决定。这会返回:"[(datetime.timedelta(0, 1), 1000000)]" 我怎样才能得到一个正常的数字?
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2018-03-16
相关资源
最近更新 更多