使用python创建一个时间列表中的平均值

The*_*rry 2 python

我有一个很大的时间列表(HH:MM:SS)我知道如果我想创建一个平均值,我可以将小时,秒和分钟分开并平均每个,然后将它们连接在一起.但是我觉得必须有更好的方法来做到这一点.有谁知道更好的方法吗?

谢谢!

pol*_*ath 12

转换为自午夜起的秒数并求平均值存在问题。如果你在 23:50 和 00:10 这样做,你会得到 12:00,而你想要的是 00:00。

更好的方法是平均角度

import datetime
import math
import numpy

def datetime_to_radians(x):
    # radians are calculated using a 24-hour circle, not 12-hour, starting at north and moving clockwise
    time_of_day = x.time()
    seconds_from_midnight = 3600 * time_of_day.hour + 60 * time_of_day.minute + time_of_day.second
    radians = float(seconds_from_midnight) / float(12 * 60 * 60) * 2.0 * math.pi
    return radians

def average_angle(angles):
    # angles measured in radians
    x_sum = numpy.sum([math.sin(x) for x in angles])
    y_sum = numpy.sum([math.cos(x) for x in angles])
    x_mean = x_sum / float(len(angles))
    y_mean = y_sum / float(len(angles))
    return numpy.arctan2(x_mean, y_mean)

def radians_to_time_of_day(x):
    # radians are measured clockwise from north and represent time in a 24-hour circle
    seconds_from_midnight = int(float(x) / (2.0 * math.pi) * 12.0 * 60.0 * 60.0)
    hour = seconds_from_midnight / 3600
    minute = (seconds_from_midnight % 3600) / 60
    second = seconds_from_midnight % 60
    return datetime.time(hour, minute, second)

def average_times_of_day(x):
    # input datetime.datetime array and output datetime.time value
    angles = [datetime_to_radians(y) for y in x]
    avg_angle = average_angle(angles)
    return radians_to_time_of_day(avg_angle)

average_times_of_day([datetime.datetime(2017, 6, 9, 0, 10), datetime.datetime(2017, 6, 9, 0, 20)])
# datetime.time(0, 15)

average_times_of_day([datetime.datetime(2017, 6, 9, 23, 50), datetime.datetime(2017, 6, 9, 0, 10)])
# datetime.time(0, 0)
Run Code Online (Sandbox Code Playgroud)

  • 我认为这应该是公认的答案。它对我来说非常有效。无论如何,有一个小细节需要调整:行 `hour = secondary_from_midnight / 3600` 应修改为 `hour = (seconds_from_midnight / 3600) % 24` 以处理 `hour` 具有负值的情况。例如,可以通过计算 18:20 和 20:35 的平均值来重现该错误 (3认同)

小智 6

这是@eumiro回答的一个可能的实现,但是这个逻辑只有在持续时间有效时才有效,而不是由@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))))
Run Code Online (Sandbox Code Playgroud)

同时也感谢后由@SilentGhost,及后由@Herms


eum*_*iro 5

您不想通过以下方式“平均”小时,分钟和秒:

00:59:00
01:01:00
Run Code Online (Sandbox Code Playgroud)

清楚地平均到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
Run Code Online (Sandbox Code Playgroud)