2017-10-06 64 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)