時間 (HH:MM:SS) の膨大なリストがあり、平均を作成したい場合は、時間、秒、および分を分離してそれぞれを平均し、それらを連結して戻すことができることを知っています。しかし、私はそれを行うためのより良い方法がなければならないと感じています. これを行うためのより良い方法を知っている人はいますか?
ありがとう!
時間 (HH:MM:SS) の膨大なリストがあり、平均を作成したい場合は、時間、秒、および分を分離してそれぞれを平均し、それらを連結して戻すことができることを知っています。しかし、私はそれを行うためのより良い方法がなければならないと感じています. これを行うためのより良い方法を知っている人はいますか?
ありがとう!
このように、時間、分、秒の時間を「平均化」したくありません。
00:59:00
01:01:00
に明確に平均01:00:00
化されていますが、提示されたロジックでは平均化されていません。
代わりに、すべての時間間隔を秒に変換し、平均を計算してから に戻しHH:MM:SS
ます。
00:59:00 -> 3540 seconds
01:01:00 -> 3660 seconds
============
average: 3600 seconds converted to HH:MM:SS -> 01:00:00
これは@eumiroによる回答の可能な実装の1つですが、@lazyrが指摘したように、これらが時間ではなく期間である場合にのみ、このロジックは機能します。
from datetime import timedelta
times = ['00:58:00','00:59:00','01:00:00','01:01:00','01:02:00']
print(str(timedelta(seconds=sum(map(lambda f: int(f[0])*3600 + int(f[1])*60 + int(f[2]), map(lambda f: f.split(':'), times)))/len(times))))
また、@SilentGhostの投稿と@Hermsの投稿にも感謝します。
最初にstrptimeを使用して文字列形式から時間構造体への時間を解析し、次にmktimeを使用して時間をエポックから秒に変換します。次に、すべての秒を加算して回数で割り、localtimeを使用して時間構造体に戻す必要があります。
次に例を示します。
import time
a = time.strptime("2000:11:12:13","%Y:%H:%M:%S")
b = time.strptime("2000:11:14:13","%Y:%H:%M:%S")
avg_time = time.localtime(((time.mktime(a)+time.mktime(b))/2))
>> time.struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=11, tm_min=13, tm_sec=13, tm_wday=5, tm_yday=1, tm_isdst=0)
デフォルトの年は1900年であるため、 2000年を追加したことに注意してmktime
くださいOverflowError
それを複素数に変換し、引数を取り、度数を平均する必要があります。
最後に、日付を解析して必要なものを取得し、元の時間に戻す必要があります。
from cmath import rect, phase
from math import radians, degrees
def meanAngle(deg):
complexDegree = sum(rect(1, radians(d)) for d in deg) / len(deg)
argument = phase(complexDegree)
meanAngle = degrees(argument)
return meanAngle
def meanTime(times):
t = (time.split(':') for time in times)
seconds = ((float(s) + int(m) * 60 + int(h) * 3600)
for h, m, s in t)
day = 24 * 60 * 60
toAngles = [s * 360. / day for s in seconds]
meanAsAngle = meanAngle(toAngles)
meanSeconds = meanAsAngle * day / 360.
if meanSeconds < 0:
meanSeconds += day
h, m = divmod(meanSeconds, 3600)
m, s = divmod(m, 60)
return('%02i:%02i:%02i' % (h, m, s))
print(meanTime(["15:00:00", "21:00:00"]))
# 18:00:00
print(meanTime(["23:00:00", "01:00:00"]))
# 00:00:00
最善の方法は、これらすべての値を秒数に変換し、リスト全体を平均化することだと思います。これらの時間は の文字列であると仮定しますmylist
。
time_list = map(lambda s: int(s[6:8]) + 60*(int(s[3:5]) + 60*int(s[0:2])), mylist)
average = sum(time_list)/len(time_list)
bigmins, secs = divmod(average, 60)
hours, mins = divmod(bigmins, 60)
print "%02d:%02d:%02d" % (hours, mins, secs)
これは基本的に eumiro が推奨するものです。最初の行は、各文字列の秒数を計算します。2 行目はそれらを平均化します。次の 2 行は秒数、分数、時間数を計算し、3 行目は出力を適切にフォーマットします。