it-swarm.com.de

Aufrunden auf die nächsten 30 Minuten in Python

Ich habe den folgenden Code unten.

Ich möchte TIME auf die nächsten 30 Minuten pro Stunde aufrunden. Zum Beispiel: 12:00 Uhr oder 12:30 Uhr und so weiter.

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

Danke im Voraus

10
user875139

aufrunden auf die nächsten 30 Minuten:

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

Die Formel wird von Mark Dickinson (für eine andere Frage) vorgeschlagen .

Ausgabe

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

Hinweis: Wenn die Eingabe ein zeitzonenabhängiges Datum/Uhrzeit-Objekt wie EASTERN_NOW ist, sollten Sie timezone.make_aware(rounded_dt.replace(tzinfo=None)) aufrufen, wenn Sie die gerundete Ortszeit beibehalten und die richtige tzinfo anfügen möchten. Andernfalls erhalten Sie möglicherweise falsche Zeitzoneninformationen, wenn die Rundung die Sommerzeit überschreitet Grenzen. Rufen Sie .localize() manuell auf, um zu vermeiden, dass die Ortszeit nicht mehrdeutig ist:

localize = getattr(rounded_dt.tzinfo, 'localize', None)
if localize:
   rounded_dt = localize(rounded_dt.replace(tzinfo=None),
                         is_dst=bool(rounded_dt.dst()))
16
jfs
>>> 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
>>>

Beachten Sie, dass diese Lösung die dateutil - Bibliothek eines Drittanbieters verwendet, die mit pip install dateutil installiert werden kann. Natürlich können Sie sie auch ohne __code lösen. Aber es ist einfacher damit.

2
Joran Beasley

sie können die Eingabe der Datums- und Uhrzeitzeit auseinander nehmen

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

Ausgabe

2015-09-22 15: 42: 03.587633

2015-09-22 15:30

2015-09-22 15: 46: 01.956860

22.09.2015 16:00 Uhr

1
LetzerWille

dies sollte auch funktionieren, nicht sicher über Zeitzonen

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

um vorwärts zu runden kannst du folgendes benutzen:

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

Auf die nächste 30. Minute zurückrunden

def rounded_to_the_last_30th_minute_Epoch():
    now = datetime.now()
    rounded = now - (now - datetime.min) % timedelta(minutes=30)
    return rounded
1
Thomas John

Sie können Ihre Minuten durch 30 teilen, diese runden und erneut mit 30 multiplizieren, um entweder 0, 30 oder 60 Minuten zu erhalten:

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'

Ich verwende ein datetime-Objekt, weil timedelta mit Zeitobjekten nicht funktioniert. Am Ende können Sie die Zeit mit date.time() ermitteln.

1
multivac

Danke für all die Inputs. Ich habe das mit meinem eigenen Ansatz gelöst.

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

Falls jemand anderes ein ähnliches Problem hat. Die Ausgabe von "TIME" erfolgt alle 30 Minuten, z. B. "1:00 PM" oder "1:30 PM".

0
user875139

Runden Sie mit round_mins auf den nächsten angegebenen Betrag in Minuten auf, ohne Bibliotheken von Drittanbietern und nur wenige Codezeilen zu verwenden.

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

Bis abrunden:

  • extrahieren Sie die Minute aus der Zeit, die Sie runden möchten
  • ermitteln Sie mithilfe der Unterteilung die gesamten Intervalle in der aktuellen Stunde (aus der Unterteilung der aktuellen Minute und dem Zeitintervall, d. h. den Intervallen, auf die abgerundet werden soll).
  • multiplizieren Sie das Zeitintervall mit dieser ganzen Zahl, um die abgerundeten Minuten zu erhalten
  • verwenden Sie .replace (), um die Minuten auf die abgerundeten Minuten (und Sekunden und Millisekunden auf Null) zu ändern.

Oder, in Worten, ersetzen Sie die Minuten mit der Anzahl von ganzen Intervallen (x) in den aktuellen Minuten durch diese Anzahl von Intervallen (x * Intervall):

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