在python中最接近30分钟

use*_*139 12 python time

我在下面有以下代码.

我想将TIME汇总到最近的30分钟.例如:中午12:00或下午12:30等.

EASTERN_NOW = timezone.localtime(timezone.now() + timedelta(minutes=30))

TIME = datetime.time(EASTERN_NOW.time().hour, EASTERN_NOW.time().minute).strftime(
    VALID_TIME_FORMATS[2])
Run Code Online (Sandbox Code Playgroud)

提前致谢

jfs*_*jfs 17

为了圆到最近的30分钟:此

#!/usr/bin/env python3
from datetime import datetime, timedelta

def ceil_dt(dt, delta):
    return dt + (datetime.min - dt) % delta

now = datetime.now()
print(now)    
print(ceil_dt(now, timedelta(minutes=30)))
Run Code Online (Sandbox Code Playgroud)

该公式由@Mark Dickinson提出(针对不同的问题).

产量

2015-09-22 19:08:34.839915
2015-09-22 19:30:00
Run Code Online (Sandbox Code Playgroud)

注意:如果输入是时区感知的日期时间对象,例如EASTERN_NOW你的情况,那么你应该调用timezone.make_aware(rounded_dt.replace(tzinfo=None))如果您想保留舍入的本地时间并附加正确的tzinfo,否则如果舍入越过DST边界,您可能会得到错误的时区信息.或者为避免本地时间不明确,请.localize()手动调用:

localize = getattr(rounded_dt.tzinfo, 'localize', None)
if localize:
   rounded_dt = localize(rounded_dt.replace(tzinfo=None),
                         is_dst=bool(rounded_dt.dst()))
Run Code Online (Sandbox Code Playgroud)

  • @ dan-klasson通知:脚本中的python3 shebang (3认同)

Tho*_*ohn 8

向前舍入,您可以使用:

#!/usr/bin/env python3
from datetime import datetime, timedelta

def ceil_dt(dt, delta):
    return dt + (datetime.min - dt) % delta

now = datetime.now()
print(now)    
print(ceil_dt(now, timedelta(minutes=30)))
Run Code Online (Sandbox Code Playgroud)

返回到最近的第 30 分钟

def rounded_to_the_last_30th_minute_epoch():
    now = datetime.now()
    rounded = now - (now - datetime.min) % timedelta(minutes=30)
    return rounded
Run Code Online (Sandbox Code Playgroud)


wiz*_*zeb 8

要向下和向上舍入,您可以使用这两个函数。您不需要计算秒或使用数学模块。

from datetime import timedelta, datetime

def ceil_date(date, **kwargs):
    secs = timedelta(**kwargs).total_seconds()
    return datetime.fromtimestamp(date.timestamp() + secs - date.timestamp() % secs)

def floor_date(date, **kwargs):
    secs = timedelta(**kwargs).total_seconds()
    return datetime.fromtimestamp(date.timestamp() - date.timestamp() % secs)

Run Code Online (Sandbox Code Playgroud)

用法与 timedelta 类似,因为传递了 kwargs

now = datetime.now() #15:12:12

ceil_date(now, minutes=5) #15:15:00
floor_date(now, minutes=5) #15:10:00
Run Code Online (Sandbox Code Playgroud)


Jor*_*ley 2

>>> from dateutil.rrule import rrule, MINUTELY
>>> import datetime
>>> import bisect
>>> times = list(rrule(MINUTELY,interval=30,dtstart=datetime.date.today(),count=
48))
>>> print times[bisect.bisect(times,datetime.datetime.now())]
2015-09-22 11:00:00
>>>
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案使用可以安装的第 3 方dateutilpip install dateutil库...当然,您可以在没有它的情况下解决它...但使用它会更容易。