Python 2 - 你如何向上/向下舍入到最近的6分钟?

时间:2015-04-09 18:02:28

标签: python python-2.7 datetime

有很多人在四舍五入到最近的十分钟的例子,但我无法弄清楚四舍五入到最接近的六分之一的逻辑。我认为这将是一个转换几个数字的问题,但我不能让它工作。

与我合作的代码位于my Github。我没有接近工作的块(不会给出任何输出)是:

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

现在看一下,我发现我的逻辑是不正确的 - 即使它工作正常,代码的加1和减1分是没有意义的。

无论如何,我不知道如何解决这个问题 - 有人能指出我正确的方向吗?

PS - 这是我在工作中个人使用的东西..不是在求助我的工作,但这将帮助我记录我的工作时间。不要在那里遇到任何问题。

谢谢!

8 个答案:

答案 0 :(得分:20)

这是一个舍入到最近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 operator.
  • 只需从num%6中减去num就可以得到0表示0-5,6表示6-11,依此类推。
  • 由于我们想要“舍入”而不是“地板”,我们可以通过预先添加一半基数(base//2)来偏向此结果。

答案 1 :(得分:3)

如果要舍入到最近的7分钟(例如round7(3.6) => 7round7(17.4) => 14),您可以使用内置round函数的Python,如下所示:< / p>

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

答案 2 :(得分:2)

这就是你想要的吗?

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

答案 3 :(得分:1)

只需使用round,将小时数转换为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)

答案 4 :(得分:1)

这可能不是最聪明但可读的尝试:)

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)))

答案 5 :(得分:1)

考虑的好方法是:

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

答案 6 :(得分:0)

如果你正在四舍五入,那么通用公式

x + (roundtothis - x % roundtothis)

对你有用。

我假设这是基于问题标题舍入到最接近的七,否则更改为6: 所以:

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

查看工作示例here

答案 7 :(得分:0)

我假设你想要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