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)

これで、変数「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.seconds.days属性があり、3 つの整数すべてがあります。文字列表現は、存在するすべての値に合わせて必要に応じてstr()それらを表します。[D day[s], ][H]H:MM:SS[.UUUUUU]

これらのオブジェクトには簡単な算術演算を使用できます。加算と除算は期待どおりに機能します。次に例を示します。

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

残念ながら、2 つのタイムデルタを乗算することはできないため、標準偏差の計算が難しくなります (オフセットの 2 乗はありません)。

代わりに、.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 に答える