Öffnungszeiten nach Wochentag auslesen
Öffnungszeiten nach Wochentag auslesen
Hallo,
ich habe einen Datensatz, der eine Spalte mit Öffnungszeiten von Unternehmen beinhaltet, welche folgendermaßen aufgebaut ist:
openingTimes{"":[{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":96,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Dabei sind die Tage, an denen diese Öffnungszeit gültig ist, binär kodiert (Montag = 1, Dienstag = 2, Mittwoch = 4, Donnerstag = 8, Freitag = 16, Samstag = 32, Sonntag = 64, Feiertag = 128). Die Zahl 31 beispielsweise steht hier also für Montag bis Freitag (1+2+4+8+16). Sprich, von Montag bis Freitag ist die Öffnungszeit 06:00-23:00 und am Wochenende 07:00-23:00.
Ich würde nun gerne 2 neue Spalten für jeden Wochentag erstellen (z.B. monday_open & monday_close), die mir anzeigen zu welcher Uhrzeit das Unternehmen am jeweiligen Tag öffnet und schließt. Mein Problem hierbei ist, dass die Spalte mit den Öffnungszeiten nicht für jedes Unternehmen exakt gleich ist. Beispielsweise können auch 3 oder mehr verschiedene Öffnungszeiten vorliegen, wie hier:
openingTimes{"":[{"applicable_days":192,"periods":[{"startp":"08:00","endp":"23:00"}]},{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":32,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Ebenso kann es vorkommen, dass für einen Tag mehrere Uhrzeiten vorliegen, wie hier:
openingTimes{"":[{"applicable_days":255,"periods":[{"startp":"00:00","endp":"01:00"}]},{"applicable_days":255,"periods":[{"startp":"01:30","endp":"23:59"}]}]}
Eventuell bräuchte ich also sogar 4 Spalten pro Wochentag.
Ich verzweifle langsam ein bisschen daran, einen allgemeingültigen Befehl zu finden. Vielleicht denke ich auch zu kompliziert. Hat irgendjemand vielleicht eine Idee? Vielen Dank an alle im Voraus
ich habe einen Datensatz, der eine Spalte mit Öffnungszeiten von Unternehmen beinhaltet, welche folgendermaßen aufgebaut ist:
openingTimes{"":[{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":96,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Dabei sind die Tage, an denen diese Öffnungszeit gültig ist, binär kodiert (Montag = 1, Dienstag = 2, Mittwoch = 4, Donnerstag = 8, Freitag = 16, Samstag = 32, Sonntag = 64, Feiertag = 128). Die Zahl 31 beispielsweise steht hier also für Montag bis Freitag (1+2+4+8+16). Sprich, von Montag bis Freitag ist die Öffnungszeit 06:00-23:00 und am Wochenende 07:00-23:00.
Ich würde nun gerne 2 neue Spalten für jeden Wochentag erstellen (z.B. monday_open & monday_close), die mir anzeigen zu welcher Uhrzeit das Unternehmen am jeweiligen Tag öffnet und schließt. Mein Problem hierbei ist, dass die Spalte mit den Öffnungszeiten nicht für jedes Unternehmen exakt gleich ist. Beispielsweise können auch 3 oder mehr verschiedene Öffnungszeiten vorliegen, wie hier:
openingTimes{"":[{"applicable_days":192,"periods":[{"startp":"08:00","endp":"23:00"}]},{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":32,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Ebenso kann es vorkommen, dass für einen Tag mehrere Uhrzeiten vorliegen, wie hier:
openingTimes{"":[{"applicable_days":255,"periods":[{"startp":"00:00","endp":"01:00"}]},{"applicable_days":255,"periods":[{"startp":"01:30","endp":"23:59"}]}]}
Eventuell bräuchte ich also sogar 4 Spalten pro Wochentag.
Ich verzweifle langsam ein bisschen daran, einen allgemeingültigen Befehl zu finden. Vielleicht denke ich auch zu kompliziert. Hat irgendjemand vielleicht eine Idee? Vielen Dank an alle im Voraus
Re: Öffnungszeiten nach Wochentag auslesen
Hmm - soll das R sein? Wenn ja, welcher Dialekt?openingTimes{"":[{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":96,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Re: Öffnungszeiten nach Wochentag auslesen
Hallo Bugs,
das ist die Datenstruktur, richtig? Und Du möchtest daraus irgendwelche Tabellen erstellen, richtig?
Gibt es irgendwo eine Definition für die Syntax dieser Datenstruktur?
Also eigentlich suchst Du wohl sowas wie einen Parser.
Da kommen mir so Namen von einigen Tools spontan hoch:
lex, yacc, bison
Ich habe keine Ahnung, ob es entsprechende Pakete für R gibt. Erste Anlaufstelle sind wie immer die TaskViews auf CRAN.
Gruß, Jörg
das ist die Datenstruktur, richtig? Und Du möchtest daraus irgendwelche Tabellen erstellen, richtig?
Gibt es irgendwo eine Definition für die Syntax dieser Datenstruktur?
Also eigentlich suchst Du wohl sowas wie einen Parser.
Da kommen mir so Namen von einigen Tools spontan hoch:
lex, yacc, bison
Ich habe keine Ahnung, ob es entsprechende Pakete für R gibt. Erste Anlaufstelle sind wie immer die TaskViews auf CRAN.
Gruß, Jörg
Re: Öffnungszeiten nach Wochentag auslesen
Könnte ein missglücktes JSON sein, wobei das "openingTimes" am Anfang nicht valide ist. Wenn man das wegnimmt, kann man es vermutlich durch einen JSON parser jagen (jsonlite, rjson, jsonparse, rapidjsonr, ... um einpaar zu nennen)
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Öffnungszeiten nach Wochentag auslesen
Genau, die Öffnungszeiten sind als JSON angegeben. Das "openingTimes" könnte ich entfernen. Wie würde in diesem Fall eine Funktion mit jsonlite oder ähnlichen Befehlen funktionieren?
Re: Öffnungszeiten nach Wochentag auslesen
Was hast du denn schon probiert?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Öffnungszeiten nach Wochentag auslesen
Ich bin leider absoluter R-Anfänger und habe es deshalb mit einer ziemlich langen, verschachtelten ifelse-Funktion versucht, die alle möglichen Binärcodes (zwischen 1 und 255) für die jeweiligen Tage abdeckt. Im Beispiel hier zeige ich nur das erste und das letzte ifelse des Befehls. Alle anderen Codes zwischen 1 und 255 in denen ein Montag steckt, habe ich hier der Übersichtlichkeit halber weggelassen.
Der Datensatz heißt "test" und die Spalte mit den oben genannten Beispielen "openingtimes_json"
test$monday_open <- ifelse(grepl(":1,", test$openingtimes_json), str_match(test$openingtimes_json, '1,"periods":(.*?)"startp":"(.*?)"')[,3], ifelse(grepl(":255,", test$openingtimes_json), str_match(test$openingtimes_json, '255,"periods":(.*?)"startp":"(.*?)"')[,3], "CLOSED"))
Bisher dachte ich die Lösung ist zwar nicht elegant, funktioniert aber. Leider funktioniert sie aber nicht für alle genannten Fälle (mehrere Öffnungszeiten an einem Tag usw.)
Re: Öffnungszeiten nach Wochentag auslesen
Genau genommen hast Du zwei Probleme - einmal das Einlesen einer json-Datei nach R und dann die Transformation der Daten in eine Dir passend erscheinende Struktur.
So wie ich das sehe, versuchst Du beide Probleme auf einen Schwupp in den Griff zu bekommen, indem Du (unter anderem) die json-Datei als Text einliest und den Öffnungszeiten-Abschnitt mit Textverarbeitungsfunktionen zu verarbeiten versuchst. Das erscheint mir für Deinen Wissensstand mutig, aber wenig zweckmäßig ...
Kannst Du bitte die Originaldaten (oder einen Teil davon) mit den bisher unterschlagenen Inhalten (etwa der Unternehmenskennung) zeigen?
So wie ich das sehe, versuchst Du beide Probleme auf einen Schwupp in den Griff zu bekommen, indem Du (unter anderem) die json-Datei als Text einliest und den Öffnungszeiten-Abschnitt mit Textverarbeitungsfunktionen zu verarbeiten versuchst. Das erscheint mir für Deinen Wissensstand mutig, aber wenig zweckmäßig ...
Kannst Du bitte die Originaldaten (oder einen Teil davon) mit den bisher unterschlagenen Inhalten (etwa der Unternehmenskennung) zeigen?
Re: Öffnungszeiten nach Wochentag auslesen
Athomas hat geschrieben: ↑Mo Sep 28, 2020 8:41 am Genau genommen hast Du zwei Probleme - einmal das Einlesen einer json-Datei nach R und dann die Transformation der Daten in eine Dir passend erscheinende Struktur.
So wie ich das sehe, versuchst Du beide Probleme auf einen Schwupp in den Griff zu bekommen, indem Du (unter anderem) die json-Datei als Text einliest und den Öffnungszeiten-Abschnitt mit Textverarbeitungsfunktionen zu verarbeiten versuchst. Das erscheint mir für Deinen Wissensstand mutig, aber wenig zweckmäßig ...
Kannst Du bitte die Originaldaten (oder einen Teil davon) mit den bisher unterschlagenen Inhalten (etwa der Unternehmenskennung) zeigen?
Es handelt sich dabei um diesen Datensatz, den ich als CSV in R eingelesen habe:
https://dev.azure.com/tankerkoenig/_git ... ations.csv
Vielleicht ist es so am einfachsten.
Re: Öffnungszeiten nach Wochentag auslesen
Ich möchte vorschlagen, daraus zwei Fragen zu machen:
R bietet vielfältige Möglichkeiten, daraus bei Bedarf schnell wieder eine "Breitversion" zu machen...
- Einmal ist dieser csv-json-Wolpertinger so einzulesen, dass er ohne weitere Verrenkungen in R verarbeitbar ist (m.E. am besten als Dataframe mit den Feldern "uuid", "applicable_days" sowie "startp" und "endp", also häufig mehrere Sätze pro Tanke), und danach
- ist das Resultat in die von Dir gewünschte (oder eine "bessere") Form zu bringen
R bietet vielfältige Möglichkeiten, daraus bei Bedarf schnell wieder eine "Breitversion" zu machen...