Python中的舍入时间

时间:2011-07-24 11:21:49

标签: python datetime time modulo rounding

通过控制舍入分辨率,在Python中对时间相关类型执行h / m / s舍入操作的优雅,高效和Pythonic方法是什么?

我的猜测是需要时间模运算。说明性示例:

  • 20:11:13%(10秒)=> (3秒)
  • 20:11:13%(10分钟)=> (1分13秒)

我能想到的相关时间相关类型:

  • datetime.datetime \ datetime.time
  • struct_time

8 个答案:

答案 0 :(得分:15)

对于datetime.datetime舍入,请参阅此函数: https://stackoverflow.com/a/10854034/1431079

使用样本:

print roundTime(datetime.datetime(2012,12,31,23,44,59,1234),roundTo=60*60)
2013-01-01 00:00:00

答案 1 :(得分:14)

如何使用datetime.timedelta s:

import time
import datetime as dt

hms=dt.timedelta(hours=20,minutes=11,seconds=13)

resolution=dt.timedelta(seconds=10)
print(dt.timedelta(seconds=hms.seconds%resolution.seconds))
# 0:00:03

resolution=dt.timedelta(minutes=10)
print(dt.timedelta(seconds=hms.seconds%resolution.seconds))
# 0:01:13

答案 2 :(得分:2)

我想我会以秒为单位转换时间,并从那时起使用标准的模运算。

20:11:13 = 20*3600 + 11*60 + 13 = 72673秒

72673 % 10 = 3

72673 % (10*60) = 73

这是我能想到的最简单的解决方案。

答案 3 :(得分:2)

您可以将两次转换为秒,执行模运算

from datetime import time

def time2seconds(t):
    return t.hour*60*60+t.minute*60+t.second

def seconds2time(t):
    n, seconds = divmod(t, 60)
    hours, minutes = divmod(n, 60)
    return time(hours, minutes, seconds)

def timemod(a, k):
    a = time2seconds(a)
    k = time2seconds(k)
    res = a % k
    return seconds2time(res)

print(timemod(time(20, 11, 13), time(0,0,10)))
print(timemod(time(20, 11, 13), time(0,10,0)))

输出:

00:00:03
00:01:13

答案 4 :(得分:2)

这会将时间数据四舍五入到问题中提到的分辨率:

import datetime as dt
current = dt.datetime.now()
current_td = dt.timedelta(hours=current.hour, minutes=current.minute, seconds=current.second, microseconds=current.microsecond)

# to seconds resolution
to_sec = dt.timedelta(seconds=round(current_td.total_seconds()))
print dt.datetime.combine(current,dt.time(0))+to_sec

# to minute resolution
to_min = dt.timedelta(minutes=round(current_td.total_seconds()/60))
print dt.datetime.combine(current,dt.time(0))+to_min

# to hour resolution
to_hour = dt.timedelta(hours=round(current_td.total_seconds()/3600))
print dt.datetime.combine(current,dt.time(0))+to_hour

答案 5 :(得分:1)

我使用以下代码段来舍入到下一个小时:

import datetime as dt

tNow  = dt.datetime.now()
# round to the next full hour
tNow -= dt.timedelta(minutes = tNow.minute, seconds = tNow.second, microseconds =  tNow.microsecond)
tNow += dt.timedelta(hours = 1)

答案 6 :(得分:0)

这是每小时取整的有损*版本:

dt = datetime.datetime
now = dt.utcnow()
rounded = dt.utcfromtimestamp(round(now.timestamp() / 3600, 0) * 3600)

相同的原理可以应用于不同的时间跨度。

* 上面的方法假定使用了UTC,因为任何时区信息在转换为时间戳时都会被破坏。

答案 7 :(得分:-4)

def round_dt_to_seconds(dt):
    datetime.timedelta(seconds=dt.seconds)