Seite 1 von 1

Bibliothek holiday schlägt fehl

Verfasst: Mittwoch 1. Januar 2025, 18:11
von DMD-OL
Hi Ihr Hasen,
ich würde gern mit der Bibliothek holidays arbeiten, um ggf. den bestimmten Namen eines Feiertag durch Datumseingabe zu erhalten.
Ich habe mit

Code: Alles auswählen

pip install holidays
die holiday-Bibliothek Version 0.63 installiert.
Mein Code

Code: Alles auswählen

import holidays
from datetime import date

# Feiertage für Deutschland (bundesweit)
de_feiertage = holidays.Germany()

# Beispiel-Datum
datum = date(2025, 1, 1)  # Neujahr

# Überprüfen, ob das Datum ein Feiertag ist
if datum in de_feiertage:
    feiertagsname = de_feiertage[datum]
    print(f"Der Feiertag am {datum} ist: {feiertagsname}")
else:
    print(f"Am {datum} ist kein Feiertag.")
Dieser Code verursacht den Fehler

Code: Alles auswählen

 Traceback (most recent call last):
   File "/home/dmd/Dokumente/PyCharm/Test/test_1.py", line 5, in <module>
     de_feiertage = holidays.Germany()
 AttributeError: module 'holidays' has no attribute 'Germany'
Im Netz findet man nur diese oder ähnliche Herangehensweisen.
Wurde die Version 0.63 irgendwie neuerdings geändert???

Re: Bibliothek holiday schlägt fehl

Verfasst: Mittwoch 1. Januar 2025, 18:31
von sparrow
Wo steht das denn im Netz?
Was sagt die Dokumentationß
Die Landing-Page bei PyPI zeigt ein Beispiel, und da steht nichts davon, dass die Länder ausgeschrieben werden. Die werden anhand des 2-stelligen ISO-Codes ermittelt:

Beispiel der PyPI Landing-Page des Moduls:

Code: Alles auswählen

from datetime import date
import holidays

us_holidays = holidays.US()  # this is a dict-like object
# the below is the same, but takes a string:
us_holidays = holidays.country_holidays('US')  # this is a dict-like object

nyse_holidays = holidays.NYSE()  # this is a dict-like object
# the below is the same, but takes a string:
nyse_holidays = holidays.financial_holidays('NYSE')  # this is a dict-like object

date(2015, 1, 1) in us_holidays  # True
date(2015, 1, 2) in us_holidays  # False
us_holidays.get('2014-01-01')  # "New Year's Day"
Ich würe da mal mutig "US" durch "DE" ersetzen und schauen.

Re: Bibliothek holiday schlägt fehl

Verfasst: Mittwoch 1. Januar 2025, 19:47
von noisefloor
Das funktioniert bei mir alles einwandfrei...

Code: Alles auswählen

>>> import holidays
>>> ferien_de = holidays.Germany()
>>> ferien_de
holidays.country_holidays('DE')
>>> from datetime import date
>>> heute = date.today()
>>> heute in ferien_de
True
>>>

Getestet unter Ubuntu 22.04 in WSL2, das holidays Modul habe ich via pip installiert, installiert ist 0.63. Statt `Germany` kann man auch `DE` oder `DEU` nehmen.

Gruß, noisefloor

Re: Bibliothek holiday schlägt fehl

Verfasst: Mittwoch 1. Januar 2025, 21:12
von bb1898
noisefloor hat geschrieben: Mittwoch 1. Januar 2025, 19:47 Das funktioniert bei mir alles einwandfrei...

Code: Alles auswählen

>>> import holidays
>>> ferien_de = holidays.Germany()
>>> ferien_de
holidays.country_holidays('DE')
>>> from datetime import date
>>> heute = date.today()
>>> heute in ferien_de
True
>>>

Getestet unter Ubuntu 22.04 in WSL2, das holidays Modul habe ich via pip installiert, installiert ist 0.63. Statt `Germany` kann man auch `DE` oder `DEU` nehmen.

Gruß, noisefloor
Aber hier sind mit "holidays" doch wohl Feiertage gemeint, nicht Ferien? Praktisch wäre es, gleich in einem Rutsch "holidays.country_holidays("DACH") oder ("D-A-CH") abfragen zu können. Für alle möglichen Ausflüge.

Re: Bibliothek holiday schlägt fehl

Verfasst: Mittwoch 1. Januar 2025, 21:24
von noisefloor
Praktisch wäre es, gleich in einem Rutsch...
Das geht so:

Code: Alles auswählen

>>> import holidays
>>> foo = holidays.DEU()
>>> bar = holidays.CH()
>>> spam = foo+bar
>>> from datetime import date
>>> tdde = date(2024, 10, 3)
>>> tdde in spam
True
>>> snft = date(2025, 8, 1)
>>> snft in spam
True
Wenn du natürlich möchtest, dass die API erlaubt, mehrere Länder anzugeben, muss du dich wohl direkt an den Entwickler wenden.

Gruß, noisefloor

Re: Bibliothek holiday schlägt fehl

Verfasst: Freitag 3. Januar 2025, 13:23
von DMD-OL
WIESO FUNKTIONIERT DIE SCHEISSE BEI MIR NICHT AAAAHHHHHHH!!!!!!!!!!!!!!!!!
das hier hab ich auch schon getestet: us_holidays = holidays.country_holidays('US'
Funst auch nicht. Shit

Re: Bibliothek holiday schlägt fehl

Verfasst: Freitag 3. Januar 2025, 13:57
von Sirius3
Ist das der typische Fehler, dass es in deinem aktuellen Verzeichnis auch noch eine Datei holidays.py gibt?

Re: Bibliothek holiday schlägt fehl

Verfasst: Samstag 4. Januar 2025, 02:47
von DeaD_EyE
Man könnte mehrere Länder so abfragen:

Code: Alles auswählen

from datetime import date as Date
import holidays


def is_holiday(date: Date, *countries: str) -> bool:
    """
    Return True if the date is in one of the countries a holiday.
    The countries are noted as ISO 3166-1 Alpha-2 country code.
    """
    holiday_chain = [holidays.country_holidays(code) for code in countries]

    for country in holiday_chain:
        if date in country:
            return True

    return False


is_holiday(Date(2025, 10, 3), "DE", "CH", "AT")

Re: Bibliothek holiday schlägt fehl

Verfasst: Samstag 4. Januar 2025, 12:00
von __blackjack__
Ich würde da nicht ohne Not *magie verwenden. Und das ganze ein bisschen kompakter formulieren. Das ist ein Fall für `any()`.

Code: Alles auswählen

def is_holiday(date, countries):
    """
    Return True if the date is in one of the countries a holiday.
    The countries are noted as ISO 3166-1 Alpha-2 country code.
    """
    return any(
        date in holidays.country_holidays(country) for country in countries
    )


is_holiday(Date(2025, 10, 3), ["DE", "CH", "AT"])

Re: Bibliothek holiday schlägt fehl

Verfasst: Samstag 4. Januar 2025, 20:27
von DeaD_EyE
Ja, auch eine gute Lösung.

Ich verwende any() und all() zu selten.

any(...) bricht ab und liefert True, sobald ein Element den Wert True zurückgibt. Die anderen Elemente werden dann nicht mehr überprüft, so wie in meinem Beispiel, aber bei CPython ist das in C implementiert und dadurch auch schneller. Am längsten dauert es, wenn alle Elemente False sind. Dann muss any() zwangsweise auch über alle Elemente iterieren.

Funktioniert die Bibliothek denn jetzt? Der Name holiday.py ist wie bereits erwähnt tabu. Das gilt aber auch für anderen Dateien mit der Endung .py, die sich neben dem eigentlichen Programm befinden.

Der Pfad des Programms, dass man mit Python startet, wird als Erstes dem Suchpfad für Module hinzugefügt. Das ähnlich wie bei any(). Der Pfad, in dem das gesuchte Modul zuerst gefunden wird, wird auch als erstes ausgegeben. Wenn nichts gefunden wird, wird ein ImportError ausgelöst.

Bei CPython gibt es den Optionsschalter -P, der unsichere Pfade nicht zu sys.path hinzufügt. Damit ließe sich um das Problem drumherumarbeiten, was aber keine Lösung des eigentlichen Problems ist.

Re: Bibliothek holiday schlägt fehl

Verfasst: Samstag 4. Januar 2025, 21:17
von snafu
DeaD_EyE hat geschrieben: Samstag 4. Januar 2025, 20:27 any(...) bricht ab und liefert True, sobald ein Element den Wert True zurückgibt. Die anderen Elemente werden dann nicht mehr überprüft, so wie in meinem Beispiel, aber bei CPython ist das in C implementiert und dadurch auch schneller. Am längsten dauert es, wenn alle Elemente False sind. Dann muss any() zwangsweise auch über alle Elemente iterieren.
Also ich sehe any() und all() rein aus der semantischen Sicht. Sie tun halt genau das, was man auch selbst als Schleife programmieren würde. Die meist marginalen Unterschiede bei der Ausführungszeit interessieren mich dabei nicht wirklich.

Generell lässt sich sagen:
- mind. 1 Element muss wahr sein --> any()
- alle Elemente müssen wahr sein --> all()
- mind. 1 Element muss falsch sein --> not all()
- alle Elemente müssen falsch sein --> not any()

Re: Bibliothek holiday schlägt fehl

Verfasst: Dienstag 7. Januar 2025, 16:38
von DMD-OL
OH, ja tatsächlich habe ich ein MDScreen das holidays.py heißt. THANKS :)

Re: Bibliothek holiday schlägt fehl

Verfasst: Mittwoch 8. Januar 2025, 23:15
von DMD-OL
Hey, ich habe es jetzt zum Laufen bekommen wie ich es gern habe :)
Ich benutze die Bibliothek holidays in Kivy/KivyMD.
Nächstes Problem mit diesem Modul:
Benutze ich in Kivy/KivyMD den import holidays-Befehl, bricht die App bei Übertragung mit buildozer auf mein Handy ab.
Kommentiere ich in meinem Code import holidays aus, funktioniert alles. In der buildozer.spec habe ich unter den requirements folgendes angegeben:

Code: Alles auswählen

requirements = python3==3.10.12,hostpython3==3.10.12,kivy==2.3.0,kivymd==1.2.0,pydantic,sqlite3,holidays==0.63
Auch dies:

Code: Alles auswählen

requirements = python3==3.10.12,hostpython3==3.10.12,kivy==2.3.0,kivymd==1.2.0,pydantic,sqlite3,holidays
funktioniert nicht. App crashed.
Kann mir das jemand helfen? Ist holidays kompatibel mit Kivy/KivyMD? Andere Version?
Oder kann ich besser auf ein anderes Modul ausweichen?