我有一个很大的时间列表(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)
小智 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)
您不想通过以下方式“平均”小时,分钟和秒:
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)
| 归档时间: |
|
| 查看次数: |
10991 次 |
| 最近记录: |