Python 2 - Как бы вы округлили вверх/вниз до ближайших 6 минут?

Есть многочисленные примеры людей, округляющихся до ближайших десяти минут, но я не могу понять логику округления до ближайших шести. Я думал, что это будет вопрос переключения нескольких номеров, но я не могу заставить его работать.

Код, с которым я работаю, находится в моем Github. Блок, который у меня есть, даже близко не работает (не выдаст никакого результата):

def companyTimer():
    if minutes % 6 > .5:
        companyMinutes = minutes + 1
    elif minutes % 6 < 5:
        companyMinutes = minutes - 1
    else:
        companyMinutes = minutes
    print companyMinutes

Посмотрев на это сейчас, я вижу, что моя логика неверна - даже если она работает, добавление и вычитание 1-минутной части кода не имеет смысла.

В любом случае, я понятия не имею, как исправить это - может ли кто-нибудь указать мне в правильном направлении, пожалуйста?

PS - это то, что я делаю для личного использования на работе. Не прошу о помощи с моей работой, но это поможет мне отслеживать мои часы на работе. Не хотите, чтобы с этим были проблемы.

Спасибо!

Ответы

Ответ 1

Здесь общая функция для округления до ближайшего x:

def round_to_nearest(num, base):
    n = num + (base//2)
    return n - (n % base)

[round_to_nearest(i, 6) for i in range(20)]
# [0, 0, 0, 6, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 18, 18, 18, 18, 18]

Объяснение:

  • n % base - оставшийся остаток при делении n на base. Также известен как оператор modulo.
  • Простое вычитание num%6 из num даст вам 0 для 0-5, 6 для 6-11 и т.д.
  • Поскольку мы хотим "округлить", а не "пол", мы можем смещать этот результат, предварительно добавив половину базы (base//2).

Ответ 2

Если вы хотите округлить до ближайших 7 минут (например, round7(3.6) => 7, round7(17.4) => 14), вы можете использовать Python, встроенный в функцию round, например:

def round7(value):
    return round(value / 7.0) * 7.0

>>> round7(17.4999)
14.0
>>> round7(17.5001)
21.0

или, более общая функция:

def round_to_nearest(increment, value):
    return round(value / float(increment)) * increment

>>> round_to_nearest(7, 17.4999)
14.0
>>> round_to_nearest(6, 21.0001)
24.0

Ответ 3

Это то, что вы после?

def roundto6(minute):
    return int((minute+3) / 6) * 6

for i in xrange(13):
   print roundto6(i),

# 0 0 0 6 6 6 6 6 6 12 12 12 12 12 12

Ответ 4

просто используйте раунд, округляя часы до 1 цифры:

>>> import time
>>> import datetime
>>> now = datetime.datetime.now()
datetime.datetime(2015, 4, 9, 20, 4, 20, 578322)
>>> datetime.datetime.fromtimestamp(round(time.mktime(w.timetuple())/3600,1)*3600)
datetime.datetime(2015, 4, 9, 20, 6, 0)

Ответ 5

возможно, это не самая умная, но читаемая попытка:)

myNumber - ваша текущая минута

myList = range(0, 60, 6) # [0,6,12,18,24,30,36,42,48,54] # all accepted minutes 
myNumber = 8
print(min(myList, key=lambda x:abs(x-myNumber)))

Ответ 6

Хороший способ рассмотрения:

def companyTimer(cm):
    minutes = (time.time() - starting_time) / 60
    print(minutes)
    if minutes % 6 >= 0.5:
        cm += 1
    return cm

Где companyTimer принимает один аргумент: companyMinutes.

>>> import time
>>> starting_time = time.time()
>>> companyMinutes = 0
>>> companyTimer(companyMinutes) # will return 0 until 3 minutes have passed

Ответ 7

Если вы округлите, общая формула

x + (roundtothis - x % roundtothis)

будет вам полезен.

Я предполагаю, что это для округления до ближайшего кратного семи в зависимости от названия вопроса, иначе измените на 6: Итак:

def roundUpToSeven(minute):
    if ( minute % 7 == 0 and minute != 0 ):
        return minute
    else:
        return minute + (7 - minute % 7)

См. рабочий пример здесь

Ответ 8

Я предполагаю, что вы хотите, чтобы 2 раунда до 0, 3, чтобы остаться на 3, и 4 до раунда до 6. Это то, что вы хотите?

def companyTimer(minutes, roundingNumber):
  remainder = minutes % roundingNumber

  if remainder > roundingNumber / 2:
    companyMinutes = minutes - remainder + roundingNumber
  elsif remainder < roundingNumber / 2:
    companyMinutes = minutes - remainder
  else:
    companyMinutes = minutes
  print companyMinutes