*This macro takes a begin and end datetime in quotes, and then calculates steps. *Useful for generating aggregate statistics. DEFINE !TimeExpand (Begin = !TOKENS(1) /End = !TOKENS(1) /Step = !DEFAULT("60*60*24") !TOKENS(1) /Var = !DEFAULT (DT) !TOKENS(1) /Dataset = !DEFAULT ("TimeExpan") !TOKENS(1) ) INPUT PROGRAM. COMPUTE #Begin = !UNQUOTE(!Begin). COMPUTE #End = !UNQUOTE(!End). COMPUTE #Step = !UNQUOTE(!Step). LOOP #i = #Begin TO #End BY #Step. COMPUTE !Var = #i. END CASE. END LOOP. END FILE. END INPUT PROGRAM. DATASET NAME !UNQUOTE(!Dataset). FORMATS !Var (DATETIME17). EXECUTE. !ENDDEFINE. *Example with defaults. *TimeExpand Begin = "DATE.MDY(01,01,2013)" End = "DATE.MDY(01,01,2014)". *15 minute example. *DATASET CLOSE ALL. *TimeExpand Begin = "DATE.MDY(01,01,2013)" End = "DATE.MDY(01,01,2014) - TIME.HMS(0,10)" Step = "15*60" Dataset = "Time15min". *Week from a begin date example. *DATASET CLOSE ALL. *TimeExpand Begin = "DATE.MDY(01,01,2013)" End = "DATE.MDY(01,01,2014)" Step = "60*60*24*7" Dataset = "WeekBin". *Backwards!. *DATASET CLOSE ALL. *TimeExpand Begin = "DATE.MDY(01,01,2014)" End = "DATE.MDY(01,01,2013)" Step = "-60*60*24*7" Dataset = "WeekBinBack". *1 Minute example. *DATASET CLOSE ALL. *TimeExpand Begin = "DATE.MDY(01,01,2013)" End = "DATE.MDY(01,01,2014) - TIME.HMS(0,0,1)" Step = "60" Dataset = "Time1min". *You can use current date-time. *DATASET CLOSE ALL. *TimeExpand Begin = "DATE.MDY(01,01,2013)" End = "XDATE.DATE($TIME)". *Valid types are years, quarters, months, weeks, days, hours, minutes, seconds. DEFINE !DateExpand (Begin = !TOKENS(1) /End = !TOKENS(1) /Type = !TOKENS(1) /Var = !DEFAULT (DT) !TOKENS(1) /Dataset = !DEFAULT ("DateExpan") !TOKENS(1) ) INPUT PROGRAM. COMPUTE #B = !UNQUOTE(!Begin). COMPUTE #E = !UNQUOTE(!End). COMPUTE #Int = DATEDIFF(#E,#B,!Type). LOOP #i = 0 TO #Int. COMPUTE !Var = DATESUM(#B,#i,!Type). END CASE. END LOOP. END FILE. END INPUT PROGRAM. DATASET NAME !UNQUOTE(!Dataset). FORMATS !Var (DATETIME17). !ENDDEFINE. *DATASET CLOSE ALL. *DateExpand Begin = "DATE.MDY(01,01,2013)" End = "DATE.MDY(01,01,2014)" Type = "DAYS". *DATASET CLOSE ALL. *DateExpand Begin = "DATE.MDY(01,01,2013)" End = "DATE.MDY(01,01,2014)" Type = "MONTHS" Dataset = "DateMon". *DATASET CLOSE ALL. *DateExpand Begin = "DATE.MDY(01,01,2013)" End = "$TIME" Type = "MINUTES" Dataset = "DateMin". *These macros are the same except fill in a panel dataset of given ids. DEFINE !PanelFillTime (OrigData = !TOKENS(1) /Id = !TOKENS(1) /DateVar = !TOKENS(1) /Begin = !TOKENS(1) /End = !TOKENS(1) /Step = !DEFAULT("60*60*24") !TOKENS(1) /NewData = !DEFAULT ("TimeExpan") !TOKENS(1) ) *Making dataset with just the IDs. DATASET ACTIVATE !OrigData. SORT CASES BY !DateVar !Id. DATASET DECLARE Ids. AGGREGATE OUTFILE='Ids' /BREAK=!Id /!DateVar = FIRST(!DateVar). DATASET ACTIVATE Ids. SELECT IF NOT MISSING(!Id). COMPUTE Const = 1. CASESTOVARS /ID = Const /DROP !DateVar. NUMERIC @End. *Making expanded time set. INPUT PROGRAM. COMPUTE #Begin = !UNQUOTE(!Begin). COMPUTE #End = !UNQUOTE(!End). COMPUTE #Step = !UNQUOTE(!Step). LOOP #i = #Begin TO #End BY #Step. COMPUTE !DateVar = #i. END CASE. END LOOP. END FILE. END INPUT PROGRAM. DATASET NAME !UNQUOTE(!NewData). DATASET ACTIVATE !UNQUOTE(!NewData). FORMATS !DateVar (DATETIME17). COMPUTE Const = 1. *Merging in IDs. MATCH FILES FILE = * /TABLE = 'Ids' /BY Const. DATASET CLOSE Ids. VARSTOCASES /MAKE !Id FROM !CONCAT(!Id,".1") TO @End /DROP Const. MATCH FILES FILE = * /TABLE = !QUOTE(!OrigData) /BY !DateVar !Id. !ENDDEFINE. *Testing it out. *DATA LIST FREE / MyId (F1.0) DateX (ADATE8) DataEx. *BEGIN DATA *1 1/1/2010 1 *1 1/3/2010 2 *1 1/5/2010 3 *2 1/2/2010 4 *2 1/3/2010 5 *2 1/5/2010 6 *END DATA. *DATASET NAME AggPan. *PanelFillTime OrigData = AggPan Id = MyId DateVar = DateX Begin = "DATE.MDY(1,1,2010)" End = "DATE.MDY(1,6,2010)". *If you want the missing dates to be zero, simple as. *RECODE DataEx (SYSMIS=0)(ELSE=COPY). *If you want the missing dates to be the last value, use. *SORT CASES BY MyId DateX. *IF MISSING(DataEx) DataEx = LAG(DataEx). *EXECUTE. *Valid types are years, quarters, months, weeks, days, hours, minutes, seconds. DEFINE !PanelFillDate (OrigData = !TOKENS(1) /Id = !TOKENS(1) /DateVar = !TOKENS(1) /Begin = !TOKENS(1) /End = !TOKENS(1) /Type = !TOKENS(1) /NewData = !DEFAULT ("DateExpan") !TOKENS(1) ) *Making dataset with just the IDs. DATASET ACTIVATE !OrigData. SORT CASES BY !DateVar !Id. DATASET DECLARE Ids. AGGREGATE OUTFILE='Ids' /BREAK=!Id /!DateVar = FIRST(!DateVar). DATASET ACTIVATE Ids. SELECT IF NOT MISSING(!Id). COMPUTE Const = 1. CASESTOVARS /ID = Const /DROP !DateVar. NUMERIC @End. *Making expanded time set. INPUT PROGRAM. COMPUTE #B = !UNQUOTE(!Begin). COMPUTE #E = !UNQUOTE(!End). COMPUTE #Int = DATEDIFF(#E,#B,!Type). LOOP #i = 0 TO #Int. COMPUTE !DateVar = DATESUM(#B,#i,!Type). END CASE. END LOOP. END FILE. END INPUT PROGRAM. DATASET NAME !UNQUOTE(!NewData). DATASET ACTIVATE !UNQUOTE(!NewData). FORMATS !DateVar (DATETIME17). COMPUTE Const = 1. *Merging in IDs. MATCH FILES FILE = * /TABLE = 'Ids' /BY Const. DATASET CLOSE Ids. VARSTOCASES /MAKE !Id FROM !CONCAT(!Id,".1") TO @End /DROP Const. MATCH FILES FILE = * /TABLE = !QUOTE(!OrigData) /BY !DateVar !Id. !ENDDEFINE. *Testing it out. *DATA LIST FREE / MyId (F1.0) DateX (ADATE8) DataEx. *BEGIN DATA *1 1/1/2010 1 *1 1/3/2010 2 *1 1/5/2010 3 *2 1/2/2010 4 *2 1/3/2010 5 *2 1/5/2010 6 *END DATA. *DATASET NAME AggPan. *PanelFillDate OrigData = AggPan Id = MyId DateVar = DateX Begin = "DATE.MDY(1,1,2010)" End = "DATE.MDY(1,6,2010)" Type = "HOURS".