Как округлить минуту объекта datetime python

У меня есть объект datetime, созданный с использованием strptime ().

>>> tm datetime.datetime(2010, 6, 10, 3, 56, 23) 

То, что мне нужно сделать, – это минутка до ближайшей 10-й минуты. То, что я делал до этого момента, это взять минутную ценность и использовать round ().

 min = round(tm.minute, -1) 

Однако, как и в приведенном выше примере, это дает недействительное время, когда минутное значение больше 56. ie: 3:60

Что это лучший способ сделать это? Поддерживает ли это время?

8 Solutions collect form web for “Как округлить минуту объекта datetime python”

Это получит «пол» объекта datetime сохраненного в tm, округленном до отметки 10 минут до tm .

 tm = tm - datetime.timedelta(minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond) 

Если вы хотите классическое округление до ближайшей 10-минутной отметки, сделайте следующее:

 discard = datetime.timedelta(minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond) tm -= discard if discard >= datetime.timedelta(minutes=5): tm += datetime.timedelta(minutes=10) 

или это:

 tm += datetime.timedelta(minutes=5) tm -= datetime.timedelta(minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond) 

Общая функция для округления даты и времени в любое время в секундах:

 def roundTime(dt=None, roundTo=60): """Round a datetime object to any time laps in seconds dt : datetime.datetime object, default now. roundTo : Closest number of seconds to round to, default 1 minute. Author: Thierry Husson 2012 - Use it as you want but don't blame me. """ if dt == None : dt = datetime.datetime.now() seconds = (dt.replace(tzinfo=None) - dt.min).seconds rounding = (seconds+roundTo/2) // roundTo * roundTo return dt + datetime.timedelta(0,rounding-seconds,-dt.microsecond) 

Образцы с округлением 1 час и округлением 30 минут:

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

Из лучшего ответа, который я модифицировал до адаптированной версии, используя только объекты datetime, это позволяет избежать преобразования в секунды и делает код вызова более читаемым:

 def roundTime(dt=None, dateDelta=datetime.timedelta(minutes=1)): """Round a datetime object to a multiple of a timedelta dt : datetime.datetime object, default now. dateDelta : timedelta object, we round to a multiple of this, default 1 minute. Author: Thierry Husson 2012 - Use it as you want but don't blame me. Stijn Nevens 2014 - Changed to use only datetime objects as variables """ roundTo = dateDelta.total_seconds() if dt == None : dt = datetime.datetime.now() seconds = (dt - dt.min).seconds # // is a floor division, not a comment on following line: rounding = (seconds+roundTo/2) // roundTo * roundTo return dt + datetime.timedelta(0,rounding-seconds,-dt.microsecond) 

Образцы с округлением в 1 час и округлением до 15 минут:

 print roundTime(datetime.datetime(2012,12,31,23,44,59),datetime.timedelta(hour=1)) 2013-01-01 00:00:00 print roundTime(datetime.datetime(2012,12,31,23,44,49),datetime.timedelta(minutes=15)) 2012-12-31 23:30:00 

Я использовал код Stijn Nevens с большим эффектом (спасибо Stijn) и имел небольшое дополнение для совместного использования. Округление вверх, вниз и округление до ближайшего.

 def round_time(dt=None, date_delta=timedelta(minutes=1), to='average'): """ Round a datetime object to a multiple of a timedelta dt : datetime.datetime object, default now. dateDelta : timedelta object, we round to a multiple of this, default 1 minute. from: http://stackoverflow.com/questions/3463930/how-to-round-the-minute-of-a-datetime-object-python """ round_to = date_delta.total_seconds() if dt is None: dt = datetime.now() seconds = (dt - dt.min).seconds if to == 'up': # // is a floor division, not a comment on following line (like in javascript): rounding = (seconds + round_to) // round_to * round_to elif to == 'down': rounding = seconds // round_to * round_to else: rounding = (seconds + round_to / 2) // round_to * round_to return dt + timedelta(0, rounding - seconds, -dt.microsecond) 

если вы не хотите использовать условие, вы можете использовать modulo operator:

 minutes = int(round(tm.minute, -1)) % 60 

ОБНОВИТЬ

Вы хотели что-то вроде этого?

 def timeround10(dt): a, b = divmod(round(dt.minute, -1), 60) return '%i:%02i' % ((dt.hour + a) % 24, b) timeround10(datetime.datetime(2010, 1, 1, 0, 56, 0)) # 0:56 # -> 1:00 timeround10(datetime.datetime(2010, 1, 1, 23, 56, 0)) # 23:56 # -> 0:00 

.. если вы хотите результат как строку. для получения результата datetime лучше использовать timedelta – см. другие ответы;)

 def get_rounded_datetime(self, dt, freq, nearest_type='inf'): if freq.lower() == '1h': round_to = 3600 elif freq.lower() == '3h': round_to = 3 * 3600 elif freq.lower() == '6h': round_to = 6 * 3600 else: raise NotImplementedError("Freq %s is not handled yet" % freq) # // is a floor division, not a comment on following line: seconds_from_midnight = dt.hour * 3600 + dt.minute * 60 + dt.second if nearest_type == 'inf': rounded_sec = int(seconds_from_midnight / round_to) * round_to elif nearest_type == 'sup': rounded_sec = (int(seconds_from_midnight / round_to) + 1) * round_to else: raise IllegalArgumentException("nearest_type should be 'inf' or 'sup'") dt_midnight = datetime.datetime(dt.year, dt.month, dt.day) return dt_midnight + datetime.timedelta(0, rounded_sec) 

На основе Stijn Nevens и изменен для использования Django для округления текущего времени до ближайшей 15 минут.

 from datetime import date, timedelta, datetime, time def roundTime(dt=None, dateDelta=timedelta(minutes=1)): roundTo = dateDelta.total_seconds() if dt == None : dt = datetime.now() seconds = (dt - dt.min).seconds # // is a floor division, not a comment on following line: rounding = (seconds+roundTo/2) // roundTo * roundTo return dt + timedelta(0,rounding-seconds,-dt.microsecond) dt = roundTime(datetime.now(),timedelta(minutes=15)).strftime('%H:%M:%S') dt = 11:45:00 

если вам нужна полная дата и время, просто удалите .strftime('%H:%M:%S')

Не лучшее для скорости, когда исключение поймано, однако это сработает.

 def _minute10(dt=datetime.utcnow()): try: return dt.replace(minute=round(dt.minute, -1)) except ValueError: return dt.replace(minute=0) + timedelta(hours=1) 

Задержки

 %timeit _minute10(datetime(2016, 12, 31, 23, 55)) 100000 loops, best of 3: 5.12 µs per loop %timeit _minute10(datetime(2016, 12, 31, 23, 31)) 100000 loops, best of 3: 2.21 µs per loop 
  • Где я могу найти хороший онлайн-курс Python?
  • контекстное меню правой кнопкой мыши с помощью python?
  • Список поиска элементов строки, соответствующих другому списку элементов строки
  • Отображение разбиения на страницы в API приложений Google App EngineSearch
  • Как написать функцию, чтобы вернуть имя переменной в Python
  • Проверьте, пересекаются ли два адреса CIDR?
  • AccessTokenRefreshError: API-интерфейс Google Spreadsheet с учетной записью службы oAuth 2.0 приложения App Engine
  • Заменить все небуквенные символы в строке
  • Python - лучший язык программирования в мире.