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