There are times when you need to account for holidays when performing date calculations. The below holidays macro creates a data set of holidays for the specified year range. It makes adjustments for holidays that fall on a weekend such as Independence Day in 2015 which is adjusted to July 3, 2015.
/************************************************************************** * Program: holidays.sas * Author: Tom Bellmer * Created: 17MAY2013 * Purpose: create a list of holidays for the specified years * Usage: %holidays( startyear = 2013, stopyear = 2014 ) * Notes: use with a hash object to determine holiday adjustments **************************************************************************/ %macro holidays ( startyear = 2010 , stopyear = 2050 , outdsn = work.holidays , view = y ) ; data &outdsn. %if %lowcase( %substr( &view, 1, 1 ) ) = y %then / view = &outdsn. ; ; attrib year length = 3 label = 'Year' date length = 4 label = 'Date' format = date9. dayofweek length = $16 label = 'Day of Week' holiday length = $32 label = 'Holiday' ; array aholidays[ 10, 2 ] $32 _temporary_ ( "NewYear", "New Year's Day" , "MLK", "Martin L King, Jr. birthday" , "USPresidents", "President's birthdays" , "Memorial", "Memorial Day" , "USIndependence", "Independence Day" , "Labor", "Labor Day" , "Columbus", "Columbus Day" , "VeteransUSG", "Veterans Day" , "Thanksgiving", "Thanksgiving Day" , "Christmas", "Christmas" ) ; do year = &startyear. to &stopyear. ; do _n_ = 1 to dim( aholidays, 1 ) ; date = holiday( aholidays[ _n_, 1 ], year ) ; /* adjust date forward on Sunday or back on Saturday */ date = intnx( 'day', date , choosen( weekday( date ), 1, 0, 0, 0, 0, 0, -1 ) ) ; dayofweek = put( date, downame.-l ) ; holiday = aholidays[ _n_, 2 ] ; output ; end ; end ; run ; %mend ; /* EOF: holidays.sas */
No comments:
Post a Comment