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

使用python创建时间列表的平均值,python,Python,我有一个巨大的时间列表(HH:MM:SS),我知道如果我想创建一个平均值,我可以将小时、秒和分钟分开,平均每一个,然后将它们连接在一起。然而,我觉得必须有更好的方法来做到这一点。有人知道更好的方法吗 谢谢 您不希望以这种方式“平均”小时、分钟和秒的时间: 00:59:00 01:01:00 清楚地将平均值设置为01:00:00,但不符合您提供的逻辑 而是将所有时间间隔转换为秒,计算平均值并转换回HH:MM:SS 00:59:00 -> 3540 seconds 01:01:00 ->

我有一个巨大的时间列表(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

我认为最好的办法是将所有这些值转换为秒数,然后对整个列表求平均值。我假设这些时间是
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建议的。第一行计算每个字符串的秒数。第二行是它们的平均值。接下来的两行计算秒/分/小时数,第三行很好地格式化输出。

首先使用字符串格式解析时间到时间结构,然后使用历元将时间转换为秒,然后添加所有秒数并除以次数,并使用

以下是一个例子:

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)

请注意,我添加了2000年,因为@eumiro给出了默认年份1900的溢出错误,这里是@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))))

作者@silenghost,@Herms

从午夜开始转换到秒数并求平均值存在问题。如果你在23:50和00:10的时候这样做,你就可以得到你想要的12:00

一个更好的方法是去做


您需要将其转换为复数,取参数,然后平均度数

最后,您需要解析日期以获得所需的内容,然后将其转换回原始小时

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
来自cmath导入直肠,相位
从数学导入弧度、度
def平均角度(度):
complexDegree=以度表示的d的和(矩形(1,弧度(d))/len(度)
参数=相位(复杂度)
平均角度=度(参数)
返回平均角
时间(次):
t=(time.split(“:”)表示时间(以时间为单位)
秒=((浮点数)+int(m)*60+int(h)*3600)
对于h、m、s(在t中)
日=24*60*60
toAngles=[s*360/天,以秒为单位]
平均角度=平均角度(到角度)
平均秒数=平均角*天/360。
如果平均秒数小于0:
平均秒数+=天
h、 m=divmod(平均秒数,3600)
m、 s=divmod(m,60)
返回(“%02i:%02i:%02i%”(h,m,s))
打印(同时([“15:00:00”,“21:00:00”]))
# 18:00:00
打印(同时([“23:00:00”,“01:00:00”]))
# 00:00:00

可能有一种方法可以替代已经提供的伟大答案,但它是针对具体情况的。例如,如果你想平均人们每天睡觉的时间,这是通常在下午6点到早上6点之间的时间,你可以先将小时和分钟转换成十进制,这样12:30=12.5,然后你只需要在估计平均值的时间范围内加上24。对于睡眠情况,时间从早上0:00到6:00,变成24.0到30。现在你可以像平常一样估计平均值了。最后,如果平均数大于24,则只需再次减去24即可:

def hourtoDec(data):
    '''
    Transforms the hour string values in the list data
    to decimal. The format assumed is HH:mm.
    Values are transformed to float
    For example for 5:30pm the equivalent is 17.5 
    This funtion preserves NaN values
    '''
    dataOutput=[]
    for i in data:
        if not(pd.isnull(i)):
            if type(i)==type("a"):
                    h,m=i.split(':')
                    h=int(h)
                    m=int(m)
                    dataOutput.append(h+m/60.0)
            if isinstance(i, (np.float, float)):
                    dataOutput.append(i)
        else:
            dataOutput.append(i)
    return dataOutput



timestr=pd.DataFrame([ "2020-04-26T23:00:30.000", 
                      "2020-04-25T22:00:30.000", 
                      "2020-04-24T01:00:30.000", 
                      "2020-04-23T02:00:30.000"],columns=["timestamp"])
hours=timestr['timestamp'].apply(lambda x: ":".join(x.split("T")[1].split(":")[0:2]))
hoursDec=hourtoDec(hours)

times2=[]
for i in hoursDec:
    if i>=0 and i<6:
        times2.append(i+24)
    else:
        times2.append(i)

average=np.mean(times2)
if average>=24:
    average=average-24
print(average)
def hourtoDec(数据):
'''
转换列表数据中的小时字符串值
到小数点。假定格式为HH:mm。
值被转换为浮点值
例如,对于下午5:30,等效值为17.5
此函数保留NaN值
'''
数据输出=[]
对于数据中的i:
如果不是(pd.isnull(i)):
如果类型(i)=类型(“a”):
h、 m=i.split(“:”)
h=int(h)
m=int(m)
dataOutput.append(h+m/60.0)
如果存在(i,(np.float,float)):
dataOutput.append(i)
其他:
dataOutput.append(i)
返回数据输出
timestr=pd.数据帧([“2020-04-26T23:00:30.000”,
“2020-04-25T22:00:30.000”,
“2020-04-24T01:00:30.000”,
“2020-04-23T02:00:30.000”],列=[“时间戳”])
小时数=timestr['timestamp'].apply(lambda x::”.join(x.split(“T”)[1]。split(“:”[0:2]))
小时数=小时数(小时)
时间2=[]
对于12月的小时数:
如果i>=0且i=24:
平均数=平均数-24
打印(平均)

用适当的Python给出一个输入和输出的(简短)示例。只取一个绝对时间
总计#秒=小时*3600+分钟*60+秒
并求平均值,然后将其作为一个时间放回一起,怎么样?请提供一些示例数据。你是否有字符串、时间差等形式的数据……请注意,如果你的平均值不是持续时间,而是时间点,那么它会卷起,平均值变成一个模糊的概念——你需要定义午夜前后发生的事情。例如,
23:59:58
00:00:00
的平均值是多少?是
23:59:59
还是
11:59:59
?我认为这应该是公认的答案。它对我非常有效。无论如何,有一个小细节需要调整:行
hour=seconds\u from\u midnight/3600
应该修改为
hour=(seconds\u from\u midnight/3600)%24
,以处理
hour
为负值的情况。可以通过计算18:20和20:35的平均值来重现误差,我认为应该是弧度=浮点(从午夜算起的秒数)/浮点(24*60*60)*2.0*math.pi和从午夜算起的秒数=int(浮点(x)/(2.0*math.pi)*24.0*60.0*60.0)注24
def hourtoDec(data):
    '''
    Transforms the hour string values in the list data
    to decimal. The format assumed is HH:mm.
    Values are transformed to float
    For example for 5:30pm the equivalent is 17.5 
    This funtion preserves NaN values
    '''
    dataOutput=[]
    for i in data:
        if not(pd.isnull(i)):
            if type(i)==type("a"):
                    h,m=i.split(':')
                    h=int(h)
                    m=int(m)
                    dataOutput.append(h+m/60.0)
            if isinstance(i, (np.float, float)):
                    dataOutput.append(i)
        else:
            dataOutput.append(i)
    return dataOutput



timestr=pd.DataFrame([ "2020-04-26T23:00:30.000", 
                      "2020-04-25T22:00:30.000", 
                      "2020-04-24T01:00:30.000", 
                      "2020-04-23T02:00:30.000"],columns=["timestamp"])
hours=timestr['timestamp'].apply(lambda x: ":".join(x.split("T")[1].split(":")[0:2]))
hoursDec=hourtoDec(hours)

times2=[]
for i in hoursDec:
    if i>=0 and i<6:
        times2.append(i+24)
    else:
        times2.append(i)

average=np.mean(times2)
if average>=24:
    average=average-24
print(average)