Ankündigung

Einklappen
Keine Ankündigung bisher.

Datum/Zeit vergleichen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Cannon
    antwortet
    Ich habs jetzt gelöst. Nicht, wie ich gerne hätte, aber es geht:

    Code:
    datetimeNordwestIstr = sh.Aussen.Garten.Bewaesserung.NordwestII.schalten.wannAktiv()[:19]
        timestampNordwestI = int(datetime.strptime(datetimeNordwestIstr, '%Y-%m-%d %H:%M:%S').timestamp())
    Der String wird einfach abgeschnitten und dann passt es.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Zitat von Sisamiwe Beitrag anzeigen
    Schau mal in der Doku hier unter dem Punkt "Berechnung einer Zeitdauer in Sekunden von beliebigen datetime bis jetzt"
    Genau nach der Methode habe ich es auch probiert. Geht aber nicht, weil der Datumsstring ein anderes Format hat. Mein Datum sieht so aus:

    Code:
    2020-05-22 21:41:53.948823+02:00
    Meine Code dafür sieht so aus:

    Code:
    datum = datetime.strptime(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv(), '%Y-%m-%d %H:%M:%S.%f%z')
    Und der Fehler kommt:

    Code:
    ValueError: time data '2020-05-22 21:41:53.948823+02:00' does not match format '%Y-%m-%d %H:%M:%S.%f%z'
    Geht nicht, weil die Zeitzone hier im String falsch ist. %z sollte eigentlich nur funktionieren, wenn der String so ist: %z UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). (empty), +0000, -0400, +1030 ... da stört der Doppelpunkt.

    Das sollte erst ab einer späteren Version von Python geht. Und ich habe nur 3.5.3.

    Code:
    datum = datetime.fromisoformat(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv())

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Cannon

    Schau mal in der Doku hier unter dem Punkt "Berechnung einer Zeitdauer in Sekunden von beliebigen datetime bis jetzt"

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Die Python Doku ist da Dein Freund.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Das habe ich auch schon probiert. Ich habe ja auch Google. ;-)

    Das geht aber schon nicht, weil da noch die Milliskunden drin sind und ich die nicht loswerde und anscheinend auch noch die Zeitzone. Sprich mein Datum/Zeit-String sieht im Item so aus:

    2020-05-22 21:41:53.948823+02:00

    Und der Format-String sähe dann so aus:

    Code:
    '%Y-%m-%d %H:%M:%S.%f'
    Geht aber auch nicht, weil die Zeitzone wohl noch irgendwi untergebracht werden muss. Ein anhängen von einem simplen "%z" bringt auch nichts.

    Ohne %z kommt die Meldung:

    Code:
    File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
    > tt, fraction = _strptime(data_string, format)
    > File "/usr/lib/python3.5/_strptime.py", line 346, in _strptime
    > data_string[found.end():])
    Mit angehangenen %z so:

    Code:
    > File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
    > tt, fraction = _strptime(data_string, format)
    > File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime
    > (data_string, format))

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von Cannon Beitrag anzeigen
    Das mit strftime kriege ich nicht hin. Sorry ich stelle mich da zu blöd an:
    Code:

    logger.info('{}'.format(datetime(sh.Aussen.Garten. Bewaesserung.NordwestI.schalten.wannAktiv()).strft ime("%s")))
    Fehlermeldung: TypeError: an integer is required (got type str)
    Das mit dem strftime bekommst Du schon hin. strftime kannst Du aber nur auf datetime Werte anwenden. Du hast aber einen String sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.w annAktiv(). Den kannst Du aber nicht so wie Du möchtest in einen datetime Wert umwandeln. Herauszufinden wie das geht, ist einfach: https://lmgtfy.com/?q=python+convert+string+to+datetime

    Mit einem datetime wie sh.now() funktioniert das bestens mit sh.now().strftime("%s")

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Zitat von Morg Beitrag anzeigen
    Damit bekommst du Inhalt und Typ angezeigt.
    Ja entschuldige bitte ich bin da ungeduldig, weil ich das gelöst haben will. ;-)

    Ich kenne ja den Inhalt. Ich brauche mir den nicht anzeigen lassen. Ich will den lediglich wandeln. Der Inhalt ergibt sich ja aus sh.now() und ich sehe den auch im Admin-Interface.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Probier doch mal Schritt für Schritt, du machst ja auch gleich drei Wandlungen auf einmal...

    Code:
    logger.info('item {} is typ {}'.format(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv(), type(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()))
    Damit bekommst du Inhalt und Typ angezeigt.

    Dann Schritt für Schritt weitergehen.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Zitat von Msinn Beitrag anzeigen
    Eine andere Alternative wäre beide datetime Werte (wie Du es oben gemacht hast) via strftime in einen String der die Sekunden enthält umzuwandeln. Du solltest das Item allerdings nicht als foo (unbestimmer Datentyp) anlegen. Zum Vergleich musst Du dann natürlich die Strings noch in Zahlen wandeln.
    Als was sollte ich das Item dann anlegen? Als str?

    Das mit strftime kriege ich nicht hin. Sorry ich stelle mich da zu blöd an:

    Code:
    logger.info('{}'.format(datetime(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()).strftime("%s")))
    Fehlermeldung: TypeError: an integer is required (got type str)

    Daraus folgt, dass das wandeln aus einem String gar nicht so geht.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    sh.now() liefert schon ein datetime. Du vergleichst aber gegen ein Item und beim abspeichern nicht durch SmartHomeNG unterstützter Datentypen in ein Item wird der Wert in einen String gewandelt. Vor dem Vergleich musst Du ihn also zurück wandeln.

    Eine andere Alternative wäre beide datetime Werte (wie Du es oben gemacht hast) via strftime in einen String der die Sekunden enthält umzuwandeln. Du solltest das Item allerdings nicht als foo (unbestimmer Datentyp) anlegen. Zum Vergleich musst Du dann natürlich die Strings noch in Zahlen wandeln.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Mein Ansatz war ein anderer. Eigentlich bezieht sich meine Frage auf das Vergleichen von 2 Daten. Da wollte ich nicht auf Fehlersuche gehen, sondern eine Lösung haben, wie man das macht. Denn das, was ich da probiere ist wirklich nur probieren, weil ich schlichtweg keine Ahnung habe, wie ich das anstellen soll.

    Dennoch jetzt sind wir ja bei der Auswetung:

    Das Item ist von type: "<class 'str'>". Ich dachte die Frage konnte hier schon jemand beantworten. Das heißt SmartHomeNG liefert mit "sh.now() " kein DateTime, sondern einen String (typ im Item ist aber foo), während das property des Items ein DateTime iefert. Und deshalb ist jetzt die Frage, wie mache ich aus dem string ein datetime? Und wie vergleiche ich die DateTime-Objekte dann miteinander? Also nicht, wie oben von msinn geschrieben nur die Tage, sondern ich will wirklich wissen, welche Datum+Uhrzeit später bzw. früher, als die andere ist.

    Einen Kommentar schreiben:


  • Morg
    antwortet
    Zitat von Cannon Beitrag anzeigen
    Und ich habe bewusst nicht geschrieben, wie ichs versucht habe, weil ich gehofft habe einen besseren Weg empfohlen zu bekommen. Deshalb war mein Ansatz gar nicht relevant. ;-)
    Aber das, was du getan hast, und die (genaue!) Reaktion darauf, kann sehr wohl notwendig sein, um zu verstehen, was schief läuft. Aus deinen jetzt gemachten Angaben lassen sich keine Ursachen, nichtmal die genauen Fehler ermitteln.

    Am Besten arbeitest du auch nur mit copy und paste, denn wenn beim Abtippen Tippfehler auftreten, weiß hier auch keiner, ob du dich vertippt hast oder das möglicherweise eine Fehlerursache ist.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von Cannon Beitrag anzeigen
    if letzter_Regen > letztes_Mal_aktiv_NordwestI
    Damit vergleichst Du die Stringdarstellungen zweier Datumswerte. Sinnvoll wäre die Datumswerte zu vergleichen.

    Zitat von Cannon Beitrag anzeigen
    ein String nicht zuässig sei oder so
    Mit oder so kann ich nichts anfangen. Wenn Du Hilfe haben willst, musst Du schon exakte Angaben machen.

    Zitat von Cannon Beitrag anzeigen
    Anscheinend ist das Item vom Typ strin
    Kannst Du Dich auch festlegen? "Anscheinend" ist schon wieder etwas relatives worauf ich keine Hilfestellung aufbauen kann.

    Zitat von Cannon Beitrag anzeigen
    was ich nicht verstehe,
    Dann schau doch erstmal nach, ob Dein "Anschein" überhaupt stimmt.

    Zitat von Cannon Beitrag anzeigen
    Aber auch nach der Variante gehts nicht
    Nach welcher Variante?

    Zitat von Cannon Beitrag anzeigen
    if deltaNordwestI > 0 or deltaNordwestI > 0:
    Das hat nicht damit zu tun was ich geschrieben hatte!!!
    Siehe:
    Code:
    if type(dt1) is datetime.datetime and type(dt2) is datetime.datetime:
    Falls Du einen String hast, wandele ihn doch vorher in ein datetime Objekt um.

    Einen Kommentar schreiben:


  • Cannon
    antwortet
    Ich machs so:

    Code:
    letztes_Mal_aktiv_NordwestI = datetime(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()).strftime("%s")
    letzter_Regen = sh.Zentral.Wetter.Wetterstation.Regen.property.last_change.strftime("%s")
    if letzter_Regen > letztes_Mal_aktiv_NordwestI:
        .....
    Ich bekomme immer eine Meldung, dass ein String nicht zuässig sei oder so. Anscheinend ist das Item vom Typ string, was ich nicht verstehe, weil sh.now() doch eine Datum/Zeit-Objekt ist oder?

    Und ich habe bewusst nicht geschrieben, wie ichs versucht habe, weil ich gehofft habe einen besseren Weg empfohlen zu bekommen. Deshalb war mein Ansatz gar nicht relevant. ;-)

    Aber auch nach der Variante gehts nicht, weil eben das Item (wannAktiv) nicht datetime ist:

    Code:
    # Wenn es regnete erkennt das der Bodensensor in der Hecke nicht, weil er zu tief liegt, deshalb den Rasensensor verwenden.
    # Die Prüfung folgt bei NordwestI und NordwestII.
    deltaNordwestI = sh.Zentral.Wetter.Wetterstation.Regen.property.last_change - sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()
    deltaNordwestII = sh.Zentral.Wetter.Wetterstation.Regen.property.last_change - sh.Aussen.Garten.Bewaesserung.NordwestII.schalten.wannAktiv()
    if deltaNordwestI > 0 or deltaNordwestI > 0:
        Hecke_Feuchte = sh.Aussen.Garten.Boden.Feuchte.Rasen_Nordwest()
    Dann wäre die Frage, wie ich das umwandeln kann. Mit strftime?

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Zitat von Cannon Beitrag anzeigen
    Dazu möchte ich es in ein timestamp umwandeln. Das funktioniert aber irgendwie nicht.
    Wie versuchst Du das denn?

    So globalgalaktisch wie Du fragst, kann ich auch nur antworten. Das geht z.B. so:
    Code:
            if type(dt1) is datetime.datetime and type(dt2) is datetime.datetime:
                delta = dt2 - dt1
                if delta.days < 0:
                    delta = dt1 - dt2
    Mit der if Bedingung aus Schutz ob man auch den richtigen Datentyp hat. Je nach Typ Deines Items müsstest Du den vorher wandeln.

    Einen Kommentar schreiben:

Lädt...
X