Seite 1 von 1

Wiederholungen im Zeitraum prüfen

Verfasst: Mo 18. Aug 2025, 09:49
von StefKe
Hallo allerseits, gibt es eine Möglichkeit die Anzahl von Wiederholungen in einem Zeitraum zu ermitteln?
Zum Beispiel:
  • Messung - Beginn: 17.08.2025 14:59:27
    Messung - Ende: 18.08.2025 19:21:00
    erstes Ereignis: 15:00 Uhr
    Wiederholung: alle 6 Stunden
Im obigen Beispiel sollte 5x im Ergebnis stehen.
Mir fehlt grad jeglicher Formelansatz, vermutlich lässt sich das nur als Makro lösen?

Danke - Stefan

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mo 18. Aug 2025, 13:21
von karolus
StefKe hat geschrieben:
Mo 18. Aug 2025, 09:49
…vermutlich lässt sich das nur als Makro lösen?

Danke - Stefan
:roll: :roll:

Code: Alles auswählen

=AUFRUNDEN( (ende-anfang)*4 )

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mo 18. Aug 2025, 21:13
von StefKe
Hallo, das trifft es leider nicht - siehe Beispiel:
Bild

Sobald die Summe vor der ersten und der letzten Bewässerungsperiode über 6 Stunden beträgt, ist das Ergebnis leider falsch.
Die Messung in Zeile 8 ist nicht sinnvoll, aber das Ergebnis sollte 0 sein.

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mo 18. Aug 2025, 22:55
von karolus
Hallo

Code: Alles auswählen

=LET( a; OBERGRENZE(A6-1/8;1/4)+1/8 ; e; UNTERGRENZE(B6+1/8;1/4)-1/8 ; WENN(e<a ; 0 ; 1+(e-a)*4))

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mi 20. Aug 2025, 10:23
von StefKe
Hallo, bei der Formel streikt Calc -

Code: Alles auswählen

#NAME?
habe das jetzt so gelöst:

Code: Alles auswählen

import datetime as dt

def count_steps():
  start_datetime = "11.08.2025 13:14:45"
  stop_datetime = "12.08.2025 13:19:21"
  start_time = "15:00"
  step = 6 # Dauer zwischen jeder Wiederholung in Stunden
  sum_steps = 0

  start_date = start_datetime[:11]
  start_step = dt.datetime.strptime(f"{start_date} {start_time}","%d.%m.%Y %H:%M")
  stop = dt.datetime.strptime(stop_datetime,"%d.%m.%Y %H:%M:%S")
  delta = dt.timedelta(hours=step)

  while start_step < stop:
    start_step += delta
    sum_steps += 1
    print(start_step)
  print(sum_steps)
  
if __name__ == "__main__":
  count_steps()
passt auch - Danke für Deine Mühe
Stefan

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mi 20. Aug 2025, 15:55
von karolus
StefKe hat geschrieben:
Mi 20. Aug 2025, 10:23
Hallo, bei der Formel streikt Calc -

Code: Alles auswählen

#NAME?
das kann jetzt daran liegen:
  • du benutzt eine LO-version vor LO24.8 (da gabs LET noch nicht!)
  • du hast unter Optionen umgeschaltet auf [x]englische Funktionsnamen
StefKe hat geschrieben:
Mi 20. Aug 2025, 10:23
habe das jetzt so gelöst:

Code: Alles auswählen

import datetime as dt

def count_steps():
  start_datetime = "11.08.2025 13:14:45"
  stop_datetime = "12.08.2025 13:19:21"
  start_time = "15:00"
  step = 6 # Dauer zwischen jeder Wiederholung in Stunden
  sum_steps = 0

  start_date = start_datetime[:11]
  start_step = dt.datetime.strptime(f"{start_date} {start_time}","%d.%m.%Y %H:%M")
  stop = dt.datetime.strptime(stop_datetime,"%d.%m.%Y %H:%M:%S")
  delta = dt.timedelta(hours=step)

  while start_step < stop:
    start_step += delta
    sum_steps += 1
    print(start_step)
  print(sum_steps)
  
if __name__ == "__main__":
  count_steps()
passt auch - Danke für Deine Mühe
Stefan
Das funktioniert aber nur für die beiden im Code hart-codierten Daten, das geht schon besser, unter der Voraussetzung das du zuerst den Zellbereich mit den Start- und Enddatum und einer leeren Spalte daneben für die Ergebnisse selektierst

Code: Alles auswählen

from datetime import datetime as dt, timedelta as delta

LO_EPOCH = dt(1899, 12, 30)
SECS_PER_DAY = 24*60*60

def py_date(lo_date):
    lo_date, lo_time = divmod(lo_date, 1) 
    _seconds = lo_time * SECS_PER_DAY
    h_m, _seconds = divmod(_seconds, 60)
    _hours, _minutes = divmod(h_m, 60)
    return LO_EPOCH + delta(days=lo_date, hours=_hours,
                         minutes=_minutes, seconds=_seconds)

def count_events( start, end, events):
    for hour in events:
        if start < (first:=start.replace(hour=hour,minute=0,second=0)):
            first = first
            break
    c = 0
    while first < end:
        first+=delta(hours=6)
        c+=1
    return c    
    
def main():
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    data = sel.DataArray
    dates = [row[:2] for row in data]
    events = [3, 9, 15, 21]
    sel.DataArray = [( a, e, count_events(py_date(a), py_date(e), events))
                     for a, e in dates]
edit: update 26.8.2025 11:00:
ich merke gerade das »timedelta« nicht nur int's verarbeitet sondern auch float's, damit reduziert sich die Umrechnung auf:

Code: Alles auswählen

def py_date(lo_date):
    return LO_EPOCH + delta(days=lo_date)
das ist dann eigentlich zu wenig um dafür ne extra Funktion zu schreiben!

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mo 25. Aug 2025, 09:28
von StefKe
Hallo, danke - läuft :-)
Ich hab das Skript erst mal Schritt für Schritt laufen lassen, um den Ablauf zu verstehen.

PS: die Schreibweise:

Code: Alles auswählen

_datetime
wählst Du, um die Variable von dem reservierten Wort

Code: Alles auswählen

datetime
abzugrenzen?

Stefan

Re: Wiederholungen im Zeitraum prüfen

Verfasst: Mo 25. Aug 2025, 14:29
von karolus
Hallo

Ich hab nirgends »_datetime« verwendet, was ich verwendet habe sind die lokalen Variablen in der Funktion »py_date« : »_hours«, »_minutes« und »_seconds« um dem Leser zu vermitteln, das ein semantischer Unterschied zu den key-worten in der »delta( … , … , …)« funktion besteht.