valores una redondeos redondeo redondear por lista limitar decimales debajo controlar como cifras cantidad aproximar python datetime time modulo rounding

una - Tiempo de redondeo en Python



redondeo a 2 decimales python (7)

¿Qué tal el uso de 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

¿Cuál sería una forma elegante, eficiente y pitónica de realizar una operación de redondeo ah / m / s en tipos relacionados con el tiempo en Python con control sobre la resolución de redondeo?

Mi suposición es que requeriría una operación de módulo de tiempo. Ejemplos ilustrativos:

  • 20:11:13% (10 segundos) => (3 segundos)
  • 20:11:13% (10 minutos) => (1 minuto y 13 segundos)

Tipos relevantes relacionados con el tiempo que puedo pensar:

  • datetime.datetime / datetime.time
  • struct_time

Creo que convertiría el tiempo en segundos y usaría la operación de módulo estándar desde ese punto.

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

72673 % 10 = 3

72673 % (10*60) = 73

Esta es la solución más fácil que puedo pensar.


Esto redondeará los datos de tiempo a una resolución como se pide en la pregunta:

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


Para un redondeo datetime.datetime, consulte esta función: https://.com/a/10854034/1431079

Muestra de uso:

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


Puede convertir ambas veces en segundos, haga el módulo operativo

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

Productos:

00:00:03 00:01:13


Uso el siguiente fragmento de código para redondear a la siguiente hora:

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)


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