2017-10-06 94 views
0

我正在尝试使用来自this线程的代码来计算列表的平均时间。所有其他的代码建议不适合我,因为他们考虑的是持续时间而不是时间。计算列表产生错误的平均时间

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) 

我收到以下错误:

TypeError: integer argument expected, got float 

有人能帮忙吗?

+0

不要有问题来运行你的代码,并获得结果'datetime.time(0,15)'和'datetime.time(0,0)'。您可能需要重新启动机器才能重试。 – thewaywewere

+0

仍然一样。我得到了Python 3.6.2(Anaconda)。任何想法? – Peterhack

+0

请参阅下面的回复。 – thewaywewere

回答

1

这里是另一种解决方案,可以处理日期时间,对象的列表只考虑小时和分钟:

from cmath import phase 
from cmath import rect 
import datetime 
from math import degrees 
from math import radians 

dfList = ([datetime.datetime(2017, 9, 15, 8, 8), 
      datetime.datetime(2017, 9, 14, 8, 5), 
      datetime.datetime(2017, 9, 13, 6, 56), 
      datetime.datetime(2017, 12, 9, 6, 14), 
      datetime.datetime(2017, 11, 9, 6, 42)]) 

dfList = [item.strftime("%H:%M") for item in dfList] 


def mean_angle(deg): 
    return degrees(phase(sum(rect(1, radians(d)) for d in deg)/len(deg))) 


def mean_time(times): 
    t = (time.split(':') for time in times) 
    seconds = ((int(m) * 60 + int(h) * 3600) 
       for h, m in t) 
    day = 24 * 60 * 60 
    to_angles = [s * 360./day for s in seconds] 
    mean_as_angle = mean_angle(to_angles) 
    mean_seconds = mean_as_angle * day/360. 
    if mean_seconds < 0: 
     mean_seconds += day 
    h, m = divmod(mean_seconds, 3600) 
    m, s = divmod(m, 60) 
    return '%02i:%02i' % (h, m) 


print(mean_time(dfList)) 
0

您的代码在Python 2.7中运行良好,但不在Python 3.6中运行。

错误扔在第26行,return datetime.time(hour, minute, second)

hour,minutesecond改为int()后,它的工作正常。

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 = int(seconds_from_midnight/3600) 
    minute = int((seconds_from_midnight % 3600)/60) 
    second = int(seconds_from_midnight % 60) 
    return datetime.time(hour, minute, second) 
0

在Python 3 /确实即使两个操作数都是整数真(浮动)除法。

使用//代替

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)