Element in einem nested dict nach mehreren Suchkriterien finden

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
StePfl
User
Beiträge: 2
Registriert: Donnerstag 19. Januar 2017, 14:45

Hallo zusammen,

ich habe eine große Tabelle von Codes mit denen eine Auswertung gesteuert werden sollen - sie enthält neben diversen Kennwerten auch ein GültigAb-Datum und ein Gültig-Bis Datum
Hauptschlüssel ist eine 4-Stellige Integer. Zu diesem Schlüssel gibt es mehrere Datensätze, die durch eine eineindeutige Kombination von "VonDat" und "BisDat" abgegrenzt werden.
Nun wollte ich das in ein nested "dict" (Hauptschlüssel) übertragen, das wiederum eine Liste von dict mit den Steuercodes enthält.

also irgend soetwas wie:
Struktur = {"0001": [{"VonDat": 01.01.21", "BisDat" : "05.05.21", "SteuerCodeA" : "A1", "SteuerCodeB" : "B1" ...}, {"VonDat": "06.05.21", "BisDat" : 31.9.21", "SteuerCodeA" : "A2", "SteuerCodeB" : "B2" ...}, ...], "0002" : ....usw ...}

Nun soll zum Hauptschlüssel der Datensatz gefunden werden, der für den "IstDat" := "28.05.21" gültig ist - als bei welchem "VonDat" <= "IstDat" UND "BisDat" >= "IstDat" gilt.
Zusatz: Sollten mehrere Treffer gefunden werden soll es eine Fehlermeldung geben.

Da die Grundstruktur der Daten und deren Auswertung schon vorliegt und sehr groß ist ( mehrere 10.000 Datensätze) und die vorliegende Auswertung an aktuellen Änderung angepasst werden muss
(und ich mich inzwischen gerne mit Python beschäftige) möchte ich einen Weg finden wie ich das Ganze über Python nachbilden kann.
Momentan gibt es noch kein Programm, denn ich bin noch am zusammensuchen, wie ich das Ganze realisieren kann.

Für jeglichen Tip ( wo ich suchen kann / Programmschnipsel etc)wäre ich sehr dankbar.
Schönen Rest_Sonntag und herzliche Grüße
StePfl
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@StePfl

ich bin nicht ganz sicher ob ich dich richtig verstanden habe.
Die Beispiel Struktur ist die, in der gesucht werden soll? Dann würde das so funktionieren, denke ich.

In dieser Version darf allerdings insgesamt nur ein Datensatz gefunden werden.
Falls gilt, dass für jeden Hauptschlüssel ein Datensatz gefunden werden darf, muss man das entsprechend anpassen.

Code: Alles auswählen

import datetime


STRUKTUR = {
    "0001": [
        {
            "VonDat": "01.01.21",
            "BisDat": "05.05.21",
            "SteuerCodeA": "A1",
            "SteuerCodeB": "B1",
        },
        {
            "VonDat": "06.05.21",
            "BisDat": "30.9.21",
            "SteuerCodeA": "A2",
            "SteuerCodeB": "B2",
        },
    ],
    "0002": [
        {
            "VonDat": "01.10.21",
            "BisDat": "12.10.21",
            "SteuerCodeA": "A1",
            "SteuerCodeB": "B1",
        },
        {
            "VonDat": "13.10.21",
            "BisDat": "15.10.21",
            "SteuerCodeA": "A2",
            "SteuerCodeB": "B2",
        },
    ],
}


def get_datetime_from_string(string):
    return datetime.datetime.strptime(string, "%d.%m.%y")


def parse_data(data_structure, ist_dat):
    found_data_sets = {}
    for main_key, data_sets in data_structure.items():
        for data_set in data_sets:
            start_date = get_datetime_from_string(data_set["VonDat"])
            end_date = get_datetime_from_string(data_set["BisDat"])
            if start_date <= ist_dat <= end_date:
                found_data_sets[main_key] = data_set
    return found_data_sets


def main():
    ist_dat = get_datetime_from_string("28.05.21")
    retrieved_data_sets = parse_data(STRUKTUR, ist_dat)
    if len(retrieved_data_sets) > 1:
        print(
            "Ein Fehler ist aufgetreten und mehr als ein valider Datensatz wurde gefunden"
        )
    print(retrieved_data_sets)


if __name__ == "__main__":
    main()
Ausgabe

Code: Alles auswählen

{'0001': {'VonDat': '06.05.21', 'BisDat': '30.9.21', 'SteuerCodeA': 'A2', 'SteuerCodeB': 'B2'}}
StePfl
User
Beiträge: 2
Registriert: Donnerstag 19. Januar 2017, 14:45

WOW .... @rogerb... DAS nenne ich einen tollen Service. - ist viel mehr als ich erhofft hatte - und ich verstehe es auch .... TOLL!!!!

Zum Verständnis:
ich bekomme von der Hauptroutine einen "Hauptschlüssel" (zB. "0001") und ein zugehöriges "IstDatum" ( z.B. 28.05.21).
Für die Weiterverarbeitung soll aus der Vorgabenstruktur der dazu passenden Steuersatz gefunden werden.
Zu jedem der Hauptschlüssel muss es mindestens einen , darf auch mehrere Steuerdatensätze geben. Bei mehreren müssen sie durch den Gültigkeitszeitraum - "VonDat" / "BisDat" eineindeutig gegen einander abgegrenzt sein.

Die Fehlermeldung will ich auch dafür verwenden, um bei einer Neuanlage (andere Sub) deren Gültigkeit zu überprüfen.

Wenn ich deine Zeilen richtig verstehe suchst du über die gesamte "Struktur" (also über alle Hauptschlüssel) nach dem Datum - ich benötige sie aber nur über den Bereich EINES Hauptschlüssels.
Wenn ich die im Aufruf von "parse_data" übergebene "Struktur" auf "Struktur["Hauptschlüssel"] ändere müsste es vermutlich passen ..... ich bin begeistert!!!!

Ein DICKES DANKE
schönen Abend
StePfl
Antworten