Подтвердить что ты не робот

Округление до 30 минут в python

У меня есть следующий код ниже.

Я хотел бы округлить 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])

Заранее спасибо

4b9b3361

Ответ 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 (для другого вопроса).

Выход

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

Примечание. Если в вашем случае используется объект datetime, соответствующий значению часового пояса, например 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()))

Ответ 2

Вы можете разделить свои минуты на 30, округлить их и умножить на 30, чтобы получить либо 0, 30, либо 60 минут:

date = datetime.datetime(2015, 9, 22, 12, 35)
approx = round(date.minute/30.0) * 30

date = date.replace(minute=0)
date += datetime.timedelta(seconds=approx * 60)
time = date.time()
print(time.strftime('%H:%M'))
# prints '13:30'

Я использую объект datetime, потому что timedelta не работает с объектами времени. В итоге вы можете получить время с помощью date.time().

Ответ 3

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

Обратите внимание, что это решение использует стороннюю библиотеку dateutil, которая может быть установлена ​​с помощью pip install dateutil... Конечно, вы могли бы решить его без него... но это проще с ним.

Ответ 4

вы можете просто вставлять данные в формате datetime и ajust time

 def ajustTime():

from datetime import datetime

mytime= datetime.now().strftime("%Y-%m-%d %H-%M")

m = mytime.split()

hours, mints = m[1].split('-')

if 15 <= int(mints) <= 45:
    mints = ':30'
elif int(mints) < 15:
    mints = ':00'
elif int(mints) > 45:
    mints = ':00'
    h = int(hours) + 1
    hours = str(h)

print(m[0] + " " + hours + mints)

ajustTime()

Выход

2015-09-22 15: 42: 03.587633

2015-09-22 15:30

2015-09-22 15: 46: 01.956860

2015-09-22 16:00

Ответ 5

это тоже должно работать, не уверен в часовых поясах, но

rounded=time.gmtime(30*60*(round(time.time()/(30*60))))

Ответ 6

для округления вперед вы можете использовать:

#!/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)))

Округлить до ближайшей 30-й минуты

def rounded_to_the_last_30th_minute_epoch():
    now = datetime.now()
    rounded = now - (now - datetime.min) % timedelta(minutes=30)
    return rounded

Ответ 7

Спасибо за всех парней. Я решил это с помощью моего собственного подхода.

min_time = timezone.localtime(timezone.now())
min_time_est = min_time.minute 
if min_time_est > 30:
    add_mins = 60 - min_time_est
else:
    add_mins = 30 - min_time_est

EASTERN_NOW = timezone.localtime(timezone.now() + timedelta(minutes=add_mins))
TIME = datetime.time(EASTERN_NOW.time().hour, EASTERN_NOW.time().minute).strftime(
    VALID_TIME_FORMATS[2])

В случае, если у кого-то есть аналогичная проблема. О "TIME" выдается каждые 30 минут, например "1:00 PM" или "1:30 PM".

Ответ 8

округлить до ближайшего количества, указанного в минутах через round_mins, без использования сторонних библиотек и всего нескольких строк кода.

import datetime
round_mins = 30
now = datetime.datetime.now()
mins = now.minute - (now.minute % round_mins)
print datetime.datetime(now.year, now.month, now.day, now.hour, mins) + datetime.timedelta(minutes=round_mins)

Ответ 9

Чтобы округлить вниз:

  • извлеките минуту из времени, которое вы хотите округлить
  • Используя деление по полу, найдите целые интервалы, которые есть в текущем часе (от деления по полу текущей минуты и интервала времени, то есть интервалов, до которых вы хотите округлить).
  • умножьте временной интервал на это целое число, которое дает вам округленные минуты
  • используйте .replace(), чтобы изменить минуты на округленные минуты (а секунды и миллисекунды равны нулю).

Или, словами, используя количество целых интервалов (x), которые есть в текущих минутах, замените минуты на это количество интервалов (x * interval):

#!/usr/bin/env python3
def floor_dt(dt, interval):
    replace = (dt.minute // interval)*interval
    return dt.replace(minute = replace, second=0, microsecond=0)

print(datetime.now())
# datetime.datetime(2019, 5, 30, 22, 25, 31, 115901)
print(floor_dt(datetime.now(),30))
# datetime.datetime(2019, 5, 30, 22, 0)

print(datetime.now())
# datetime.datetime(2019, 5, 30, 22, 26, 29, 469555)
print(floor_dt(datetime.now(),10))
# datetime.datetime(2019, 5, 30, 22, 20)

Ответ 10

from datetime import datetime, timedelta


def round_to_nearest_half_hour(datetime_string, format):

    time = datetime.strptime(datetime_string, format)

    if time.minute <= 15:
        return time.strftime("%Y-%m-%d %H:00:00")
    elif (time.minute > 15) and (time.minute < 45):
        return time.strftime("%Y-%m-%d %H:30:00")

    return (time + timedelta(hours=1)).strftime("%Y-%m-%d %H:00:00")



print(round_to_nearest_half_hour("2019-08-30 23:58:00", "%Y-%m-%d %H:%M:%S")