Datum in Sekunden umwandeln - datetime

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Hallo,
ich möchte ein Datum in Sekunden (Unix-Timestamp) umwandeln.
Wenn ich diesen Code ausführe

Code: Alles auswählen

s = "16/08/2013 09:51:43"
mytime = datetime.strptime(s, "%d/%m/%Y %H:%M:%S")
erhalte ich die Fehlermeldung

"ValueError: unknown locale: de-DE"

Warum?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Gute Frage, ich bekomme das nicht, und ich sehe auch nicht warum das passieren sollte. Das ist ja aber nicht der ganze Code. Was verheimlichst Du uns? ;-)

Also in anderen Worten: Zeig doch mal ein komplettes, minimales, *lauffähiges* Beispiel, dass das Problem hat.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Bei mir funktioniert dein Code

Code: Alles auswählen

from datetime import datetime

s = "16/08/2013 09:51:43"
mytime = datetime.strptime(s, "%d/%m/%Y %H:%M:%S")
du musst dann eigentlich nur noch die timestamp() Methode auf das Datetimeobjekt anwenden.

"timestamp() function return the time expressed as the number of seconds that have passed since January 1, 1970"
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Seltsam,
kopiere ich den Code

Code: Alles auswählen

from datetime import datetime

s = "16/08/2013 09:51:43"
mytime = datetime.strptime(s, "%d/%m/%Y %H:%M:%S")
in ein leeres Python-Script, dann wird der Code ausgeführt.

Füge ich den Code in mein bestehendes Script (hunderte Codezeilen) ein, kommt die Fehlermeldung
raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: de-DE
Wie kann das sein?

Ist es möglich, dass ein Konflikt mit einem anderen Modul besteht?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Irgendwo scheint ja die locale gesetzt zu werden. Warum auch immer falsch. Wirklich sicher ist eigentlich nur eine leere Zeichenkette als locale zu setzen, damit die vom Betriebssystem eingestellt übernommen wird. Und die sollte dann auch existieren/bekannt sein.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Sorry, habe eine Zeile vergessen:
File "C:\Users\meinName\AppData\Local\Programs\Python\Python38\lib\locale.py", line 499, in _parse_localename
...
raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: de-DE
Die Fehlermeldung kommt unabhängig davon, ob ich nachfolgenden Code setze oder nicht:
import locale
locale.setlocale(locale.LC_ALL, '')
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Dann musst Du jetzt halt mal eingrenzen welche der hunderte Codezeilen die wir nicht kennen, dafür verantwortlich ist. Stichwort ist Intervallschachtelung.

Ich würde es erst einmal rein auf die Importe eingrenzen. Wenn Du alles von dem Code den wir nicht kennen, bis auf die Importe auskommentierst, kommt dann die Ausnahme? Falls ja, weisst Du es ist (wahrscheinlich) nicht in den auskommentierten Zeilen. Und Du kannst die zweite Hälfte der Importe auskommentieren. Kommt die Ausnahme? Dann ist das schuldige Modul in der ersten Hälfte der Importe, sonst in der Zweiten. Und so kann man das effizient weiter eingrenzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Ich habe inzwischen eine Internetseite gefunden, die genau mein Problem anspricht:

https://notes.ayushsharma.in/2017/03/fi ... -in-python

Zitat:
If you’re getting raise ValueError('unknown locale: %s' % localename) when executing your Python script, there is a simple fix. Before executing your script, run the following:

Code: Alles auswählen

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
Ich vermute die Aussage ("run the following ...") bezieht sich auf Linux-Systeme. Ich nutze aber Windows + PyCharm.

Hat jemand eine Idee, wie ich die Lösung unter Win/PyCharm umsetzen kann?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Das löst dein Problem nicht. Du hast doch selbst gesagt, dass der Fehler nur in deinem Script auftritt. Es hat also nichts mit deinem System sondern mit deinem Programm zu tun. Du musst herausfinden, was das Problem _in deinem Code_ versursacht.

Hast du den Vorschlag von __blackjack__ ausprobiert und nur deine Import und die Codezeilen in ein Script gepackt, um zu sehen ob ein Modul das Problem verursacht?
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

sparrow hat geschrieben: Freitag 5. Juni 2020, 07:47 Hast du den Vorschlag von __blackjack__ ausprobiert und nur deine Import und die Codezeilen in ein Script gepackt, um zu sehen ob ein Modul das Problem verursacht?
Ja, ich konnte den Fehler inzwischen eingrenzen.
Die Fehlermeldung erscheint bereits, wenn ich folgenden Code ausführe:

Code: Alles auswählen

import wx
from datetime import datetime

class windowMain(wx.Frame):

    def __init__(self, parent, title):
        s = "16/08/2013 09:51:43"
        mytime = datetime.strptime(s, "%d/%m/%Y %H:%M:%S")
        print(mytime.timestamp())


app = wx.App()
win111 = windowMain(None, title='Test')
app.MainLoop()
Ist das bei euch auch so?
Es muss einen Zusammenhang mit wxPython geben.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Da kommt bei mir der Fehler auch, auf Stackoverflow schreiben welche man soll wxpython downgraden.
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Jankie hat geschrieben: Freitag 5. Juni 2020, 08:33 Da kommt bei mir der Fehler auch, auf Stackoverflow schreiben welche man soll wxpython downgraden.
Danke, der Downgraden hat das Problem tatsächlich beseitigt.

Da sucht man sich einen Wolf und dann liegt die Ursache gar nicht im Programmiercode ... :-(
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

Jetzt habe ich leider noch ein Problem entdeckt.

Mein Codeschnipsel "datetime.strptime" funktioniert in pyCharm, NICHT jedoch wenn ich Das Script in eine exe-Datei umgewandelt habe (mit pyinstaller).

Die anderen Codeschnipsel funktionieren als exe.

Vielleicht eine generelle Frage: Gibt es eine andere Möglichkeit, ein Datum (04.05.2020 15:23:49) in Sekunden umzuwandeln, OHNE datetime nutzen zu müssen?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Jain. `datetime` ist *das* offensichtliche Mittel der Wahl. Du kannst es natürlich immer umständlicher/exotischer machen. Ich denke aber hier solltest Du eher das zugrundeliegende Problem suchen und lösen, statt irgendwie drum herum zu hacken.

Was bedeutet denn ”funktioniert nicht” konkret? Und wie sich es zwischen PyCharm und PyInstaller-EXE aus? Ist das venv aktiv wenn Du das ausserhalb von PyCharm normal ausführst? Wie sieht das aus wenn Du die EXE erstellst?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

__blackjack__ hat geschrieben: Samstag 6. Juni 2020, 09:58 Was bedeutet denn ”funktioniert nicht” konkret? Und wie sich es zwischen PyCharm und PyInstaller-EXE aus? Ist das venv aktiv wenn Du das ausserhalb von PyCharm normal ausführst? Wie sieht das aus wenn Du die EXE erstellst?
Ich weiß jetzt nicht was du mit "venv" meinst.

Ich versuche mein Problem etwas genauer zu beschreiben:

Ich habe eine grafische Benutzeroberfläche (wxPython) mit 3 Buttons:

Button 1 ---> Berechnung X
Button 2 ---> Berechnung Y
Button 3 ---> Berechnung Z (dieser Codeschnipsel beinhaltet "datetime.strptime")

Das Ergebnis wird in einem neuen Fenster eingeblendet.

Ausführung in pyCharm:

"Berechnung X" funktioniert
"Berechnung Y" funktioniert
"Berechnung Z" funktioniert

Ausführung als exe-Datei:
"Berechnung X" funktioniert
"Berechnung Y" funktioniert
"Berechnung Z" funktioniert NICHT (sprich: es erfolgt keine Ausgabe (vermutlich erzeugt das Script bei der Ausführung irgendeinen Fehler, den ich jedoch nicht sehe - da exe.Datei))

Nächster Test - "datetime.strptime" wird durch eine eigene Funktion (datum_in_sekunden_umwandeln) ersetzt:


Ausführung in pyCharm:

"Berechnung X" funktioniert
"Berechnung Y" funktioniert
"Berechnung Z" funktioniert

Ausführung als exe-Datei:
"Berechnung X" funktioniert
"Berechnung Y" funktioniert
"Berechnung Z" funktioniert

Seltsam, nicht wahr?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neu111: Also noch mal die Frage was passiert wenn Du das ganze nicht in PyCharm und nicht als EXE ausführst. Denn dann wäre ja klarer wo das Problem liegt: daran das es nicht in PyCharm ausgeführt wird, oder daran das es in eine EXE umgewandelt wurde.

Und wenn Du die Ausgabe bei der EXE nicht siehst, dann ja nur weil Du das nicht in einer Konsole gestartet hast, sondern als Doppelklick. Starte es halt in einer Konsole, dann siehst Du auch den Fehler.

Ich vermute ja das es im venv funktioniert das PyCharm anlegt/verwendet weil Du *dort* `wx` downgegradet hast, aber eben nicht ausserhalb weil da noch das andere `wx` existiert. `venv` solltest Du kennen(lernen) denn PyCharm verwendet das in Projekten.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

__blackjack__ hat geschrieben: Samstag 6. Juni 2020, 12:52 @Neu111: Also noch mal die Frage was passiert wenn Du das ganze nicht in PyCharm und nicht als EXE ausführst. Denn dann wäre ja klarer wo das Problem liegt: daran das es nicht in PyCharm ausgeführt wird, oder daran das es in eine EXE umgewandelt wurde.

Und wenn Du die Ausgabe bei der EXE nicht siehst, dann ja nur weil Du das nicht in einer Konsole gestartet hast, sondern als Doppelklick. Starte es halt in einer Konsole, dann siehst Du auch den Fehler.
Danke für deine Geduld.
Der Start über die Konsole war ein guter Tipp, denn es erscheint tatsächlich wieder die gleiche Fehlermeldung:

raise ValueError('unknown locale: %s' % localename)
ValueError: unknown locale: de-DE

__blackjack__ hat geschrieben: Samstag 6. Juni 2020, 12:52 Ich vermute ja das es im venv funktioniert das PyCharm anlegt/verwendet weil Du *dort* `wx` downgegradet hast, aber eben nicht ausserhalb weil da noch das andere `wx` existiert.
Mit deiner Vermutung liegst du anscheinend hundertprozentig richtig.
Mir war das gar nicht bewusst, dass zwei verschiedene wx-Installationen auf ein- und demselben Windows existieren können. Ich dachte, wenn ich in PyCharm downgrade, dann gilt das allgemein für die Windows-Umgebung auch.

Kann mir jetzt noch jemand verraten, welchen Konsolenbefehl ich eingeben muss, damit ich auch außerhalb der PyCharm-Installation das wx-Python auf Version 4.0.7 downgraden kann?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Dann führ die .exe-Datei in der Kommandozeile aus, damit dort die Fehlermeldung angezeigt wird.
Die Prosa hilft nicht weiter. Code + Fehlermeldung schon.

Eine .exe-Datei aus einem Python-Script.zu erstellen ist eher ungewöhnlich.
Neu111
User
Beiträge: 69
Registriert: Dienstag 10. März 2020, 19:02

sparrow hat geschrieben: Sonntag 7. Juni 2020, 06:49 Dann führ die .exe-Datei in der Kommandozeile aus, damit dort die Fehlermeldung angezeigt wird.
Hast du meinen letzten Beitrag vom Samstag 6. Juni 2020, 19:43 überhaupt gelesen?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

New, ich habe nur die erste Seite gesehen.

Mit pip installiert man Module für Python.
Bei der Gelegenheit solltest du dich auch gleich in das Thema virtuelle Umgebungen (virtual environments) einlesen. Ich benutze dafür nach wie vor virtualenv.

Dann hast du auch die Grundlage um zu verstehen, was deine IDE da macht und kannst beurteilen ob du die überhaupt brauchst.
Antworten