在 Python 中四舍五入到最接近的 30 分钟

新手上路,请多包涵

我在下面有以下代码。

我想将 TIME 汇总到每小时最接近的 30 分钟。例如:12:00PM 或 12:30PM 等。

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

原文由 user875139 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 544
1 个回答

向上 舍入到最接近的 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)))

该公式由@Mark Dickinson (for a different question) 建议

输出

2015-09-22 19:08:34.839915
2015-09-22 19:30:00

注意:如果输入是时区感知日期时间对象,例如 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()))

原文由 jfs 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题