Öffnungszeiten nach Wochentag auslesen

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Bugs
Beiträge: 10
Registriert: Sa Sep 26, 2020 11:41 am

Öffnungszeiten nach Wochentag auslesen

Beitrag von Bugs »

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 :)
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von Athomas »

openingTimes{"":[{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":96,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Hmm - soll das R sein? Wenn ja, welcher Dialekt?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von jogo »

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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von EDi »

Athomas hat geschrieben: Sa Sep 26, 2020 12:51 pm
openingTimes{"":[{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":96,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Hmm - soll das R sein? Wenn ja, welcher Dialekt?
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
Bild.
Bugs
Beiträge: 10
Registriert: Sa Sep 26, 2020 11:41 am

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von Bugs »

EDi hat geschrieben: Sa Sep 26, 2020 1:14 pm
Athomas hat geschrieben: Sa Sep 26, 2020 12:51 pm
openingTimes{"":[{"applicable_days":31,"periods":[{"startp":"06:00","endp":"23:00"}]},{"applicable_days":96,"periods":[{"startp":"07:00","endp":"23:00"}]}]}
Hmm - soll das R sein? Wenn ja, welcher Dialekt?
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)


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?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von EDi »

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
Bild.
Bugs
Beiträge: 10
Registriert: Sa Sep 26, 2020 11:41 am

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von Bugs »

EDi hat geschrieben: So Sep 27, 2020 1:58 pm Was hast du denn schon probiert?

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.)
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von Athomas »

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 :D ...

Kannst Du bitte die Originaldaten (oder einen Teil davon) mit den bisher unterschlagenen Inhalten (etwa der Unternehmenskennung) zeigen?
Bugs
Beiträge: 10
Registriert: Sa Sep 26, 2020 11:41 am

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von Bugs »

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 :D ...

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.
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Öffnungszeiten nach Wochentag auslesen

Beitrag von Athomas »

Ich möchte vorschlagen, daraus zwei Fragen 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
Ich könnte mir vorstellen, dass eine Langversion Deiner Daten für viele Zwecke besser geeignet ist - d.h. eine Datei, in der Tanke-ID, Wochentag (Montag bis Sonntag), Zeittyp (Öffnungs- oder Schließzeitpunkt) und die Zeitangabe aufgeführt sind.

R bietet vielfältige Möglichkeiten, daraus bei Bedarf schnell wieder eine "Breitversion" zu machen...
Antworten