Bibliothek holiday schlägt fehl

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.
Antworten
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

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???
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

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
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

Ist das der typische Fehler, dass es in deinem aktuellen Verzeichnis auch noch eine Datei holidays.py gibt?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1205
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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")
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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"])
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Benutzeravatar
DeaD_EyE
User
Beiträge: 1205
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
snafu
User
Beiträge: 6830
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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()
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

OH, ja tatsächlich habe ich ein MDScreen das holidays.py heißt. THANKS :)
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

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?
Antworten