Berechnung von Arbeitstagen in Zeitintervallen-Nutzer

Werbung
Berechnung von Arbeitstagen in Zeitintervallen-Nutzer-definierte Funktionen mit PROC FCMP vs.
Macro Lösung
Thomas Grobe
ZIEL: In Datentabellen mit Angaben zu vielen Zeitintervallen – jeweils definiert durch ein VON- und
BIS-Datum – soll die Anzahl der regulären Arbeitstage (RA) in den Intervallen ermittelt werden.
UMSETZUNG: Werden als RA zunächst alle Kalendertage von Montag bis Freitag angesehen, lässt sich
eine Ermittlung der RA relativ einfach mit der SAS-Funktion INTCK und ‘WEEKDAY17W‘ als IntervallSpezifikation realisieren. Durch Veränderungen der Intervall-Spezifikation können mit INTCK sehr
flexibel auch andere Wochentage im Sinne von RA gezählt werden (in einem eher ungewöhnlichen
Beispiel bei Angabe von ‘WEEKDAY234567W‘ z.B. nur noch alle Sonntage). Nicht von einer Zählung
ausschließen lassen sich mit INTCK allerdings die typischerweise national unterschiedlich
festgelegten Feiertage.
Zur Ermittlung von RA mit Berücksichtigung von Feiertagen findet sich gut dokumentierter SASProgrammcode von C. Hemedinger (1) im Internet, mit dem unter Rückgriff auf PROC FCMP eine
hierzu geeignete Nutzer-definierte Funktion generiert wird. Alle für die Berechnung relevanten
Feiertage müssen vor Funktionsaufruf in einer Tabelle gelistet sein (im Beispiel US-amerikanische
Feiertage des Jahres 2010), sie werden bei Funktionsaufruf in ein Array eingelesen.
Der zitierte Programmcode wurde modifiziert und um eine optionale Berücksichtigung
regionalspezifischer Feiertage erweitert. Zudem wurde ein Makro entwickelt, welches für beliebige
Jahre die z.Z. in Deutschland einheitlich sowie die in einzelnen Bundesländern (BL) gültigen Feiertage
ermittelt und in Tabellen bereitstellt. Tests der neuen Nutzer-definierten Funktionen zeigten
allerdings Laufzeiten, die bei der Verarbeitung großer Datentabellen mit vielen Mio. Beobachtungen
nur eingeschränkt akzeptabel wären (18,6 bzw. 55 Sekunden für 100.000 Intervalle, ohne bzw. mit
Berücksichtigung BL-spezifischer Feiertage).
Vor diesem Hintergrund wurde ein SAS-Makro entwickelt, welches als Alternative für die Nutzerdefinierten Funktionen bei identischen Daten identische Ergebnisse liefert. Informationen zu
Feiertagen werden dabei innerhalb von PROC SQL in nummerierten Makro-Variablen abgelegt (Bsp.:
select dat into :AD1 - :AD&NA.), die anschließend in Makro-Schleifen angesprochen werden können
(Bsp.: %DO Z=1 %TO &NA.; if &&AD&Z. = .... ). Die Laufzeiten der Makro-Lösung erwiesen sich als
erheblich kürzer (0,06 bzw. 0,08 Sekunden für 100.000 Intervalle, ohne bzw. mit Berücksichtigung BLspezifischer Feiertage).
FAZIT: Viele Wege führen zum Ziel – manche im Einzelfall erheblich schneller.
Herunterladen