Python - dateutil

Hi,
sollten die includierten Module überall gleich sein?
Unter Linux funktioniert mein code, unter Windows fehlt dateutil
Bug oder feature?

Fehlermeldung:
Meldung: <class ‘ImportError’>: No module named ‘dateutil’ (or ‘dateutil.relativedelta.relativedelta’ is unknown)

Version: 7.3.0.3 (x64) / LibreOffice Community
Build ID: 0f246aa12d0eee4a0f7adcefbf7c878fc2238db3
CPU threads: 24; OS: Windows 10.0 Build 22000; UI render: Skia/Raster; VCL: win
Locale: de-DE (de_DE); UI: de-DE
Calc: CL

Habe grade kein Windows zur Hand, aber falls auf Deinem Windows OpenOffice in Gebrauch ist, dann fehlt das dateutil weil OpenOffice Python macros mit version 2.7 interpretiert.
Wozu brauchst Du dateutil?

Nope, nur LibreOffice - OO war noch nie drauf.

Ich nutze dateutil.relativedelta um Einträge älter als ein Jahr zu filtern

        time1 = datetime.strptime(self.sheet_konto[r,0].String, '%d.%m.%Y') 
        time2 = datetime.now() - relativedelta(years=1)
        if time1 > time2:

Nein. Unter Linux gehört Python zum System und wird von LibreOffice mitbenutzt. Unter Windows installiert LibreOffice eine Art “embedded Python”, das aber nicht vollständig ist und z.B. auch kein pip enthält. Auch ein parallel installiertes python wird ignoriert.

Alles was Du brauchst sind die Zellwerte und nicht die Strings, die je nach Voreinstellung auch mal wechseln können. Oder wenn Du schon Strings verarbeitest, etwa weil das Tabellendokument falsche Strings anstelle von Werten enthält, dann solltest Du einfach den String in ein ISO-date umwandeln. Mit service FunctionAccess lässt sich dann relativedelta wie folgt errechnen:

ctx = uno.getComponentContext()
smgr = ctx.ServiceManager
srv = smgr.createInstance('com.sun.star.sheet.FunctionAccess')
time1 = srv.callFunction("VALUE", (t1,))
y2 = srv.callFunction("YEAR", (t2,))
m2 = srv.callFunction("MONTH", (t2,)) 
d2 = srv.callFunction("DAY", (t2,))
time2 = srv.callFunction("DATE", (y2, m2 +1, d2))
if time1 < time2:

t1 und t2 sind Zellwerte oder ISO-Strings (yyyy-mm-dd)
VALUE gibt das korrekte Datum wenn das Argument ein ISO-String ist. Andere Strings sind unsicher. EIn numerischer Zellwert bleibt unverändert.
YEAR,MONTH, DAY funktionieren ebenfalls mit ISO-Strings und Zahlenwerten gleichermaßen. DATE akzeptiert 3x Integer oder 3 Ziffern-Strings wobei man mit dieser Funktion auch Zeitsprünge korrekt berechnen kann, z.B. DATE(2022;month +1;0) ist der letzte Tag von month. oder DATE(2022;5;90) => 29.07.22

Im übrigen löse ich solche Affären grundsätzlich auf die Schnelle “on sheet” und niemals mit Makros. Wenn ich programmieren will dann brauche ich keine Tabellenkalkulation. Und wenn ich eine Tabellenkalkulation nutze dann will ich eigentlich gar nicht programmieren.

Danke, ich nutzte diese Funktion um die Menge an Daten für einen Dialog zu reduzieren, bin daher nicht mehr im sheet.

Kurze Antwort auf die eigentliche Frage: Nein, auch LibreOffice7.3 für Linux bringt dateutil nicht mit. Wenn es bei Dir funktioniert, dann nutzt Dein LO das vorinstallierte Python des Systems.

python-dateutil ist nirgends Teil der Standard-installation, es muss als Third-party-modul per

pip3 install python-dateutil --user

nachinstalliert werden

kann mich nicht erinnern, das jemmals getan zu haben aber das heißt nichts :wink:

P.S.: Ich habe es mit apt installiert.