现在的位置: 首页 > 编程语言 > 正文

sas用于时间的函数

2018年10月21日 编程语言 ⁄ 共 7206字 ⁄ 字号 评论关闭

处理股票数据,经常要对时间变量作处理,特意摘录sas.support.com的样例来学习sas的用于时间的函数.另外《DATE HANDLING IN THE SAS ® SYSTEM》一文中也有很多详细的例子。

*计算年龄;
/* Create sample data */
data birth;
  input name $ bday :mmddyy10.;
datalines;
Miguel      12/31/1973
Joe         02/28/1976
Rutger      03/29/1976
Broguen     03/01/1976
Susan       12/12/1976
Michael     02/14/1971
LeCe        11/09/1967
Hans        07/02/1955
Lou         07/30/1960
;run;
/* Use the INTCK function to count the number of months between       */
/* the date of birth and the current date.  Divide the number of      */
/* months by 12 to produce the number of years.  Use the MONTH        */
/* function to determine if the month of the birthday and the current */
/* date are the same.  If they are, determine if the birthday has     */
/* occurred this year.  If it hasn't, adjust the age by subtracting   */
/* one year.                                                          */  
data ages;
  set birth;
  retain current;
  if _n_=1 then current=today();
  format bday current worddate20.;
  age=int(intck('month',bday,current)/12);
  if month(bday)=month(current) then age=age-(day(bday)>day(current));
run;
proc print;run;

*计算两个日期间的年月日数目;
data a;
  input @1 dob mmddyy10.;
  /* Get the current date from operating system */
  tod=today();
  /* Determine number of days in the month prior to current month */
  bdays=day(intnx('month',tod,0)-1);
  /* Find difference in days, months, and years between */
  /* start and end dates                                */              
  dd=day(tod)-day(dob);
  mm=month(tod)-month(dob);
  yy=year(tod)-year(dob);
  /* If the difference in days is a negative value, add the number */   
  /* of days in the previous month and reduce the number of months */
  /* by 1.                                                         */
  if dd < 0 then do;
    dd=bdays+dd;
    mm=mm-1;
  end;
  /* If the difference in months is a negative number add 12 */   
  /* to the month count and reduce year count by 1.          */
  if mm < 0 then do;
    mm=mm+12;
    yy=yy-1;
  end;
  format dob tod mmddyy10.;
datalines;
01/01/1970
02/28/1992
01/01/2000
02/28/2000
02/29/2000
03/01/2000
05/10/1990
05/11/1990
05/12/1990
;
proc print label;
  label dob='Date of Birth'
        tod="Today's Date" 
         dd='Difference in Days'
         mm= 'Difference in Months'
	 yy='Difference in Years';
  var dob tod yy mm dd;
run;

/*********************************************************************/
/* The following code calculates the start and end dates for         */
/* daylight saving time for the years 2006 through 2009.             */
/*                                                                   */
/* FDOY represents the first day of the year                         */
/* FDO_APR represents the first day of April                         */
/* DST_BEG represents the first day of daylight saving time          */
/*                                                                  */
/* It is calculated using this syntax:                               */
/*    intnx('week.1',fdo_apr,(weekday(fdo_apr) ne 1))                */
/*                                                                   */
/* Explanation of the above syntax:                                  */
/*   - weekday(fdo_apr) returns a number between 1 and 7,            */
/*     which represents the day of the week, 1=Sunday and 7=Saturday */
/*                                                                   */
/*   - weekday(fdo_apr) ne 1) returns a 0 if the first day           */
/*     of April is a Sunday and 1 otherwise.                         */
/*                                                                   */
/*   - intnx('week.1',fdo_apr,(weekday(fdo_apr) ne 1)) returns a     */
/*     SAS date which is 0 WEEK intervals from the FDO_APR, if the   */
/*     first day of April is a Sunday. The WEEK.1 interval specifies */ 
/*     Sunday as the first day of the week.                          */
/*                                                                   */
/*   OR                                                              */
/*                                                                   */
/*   returns a SAS date which is 1 WEEK interval from the FDO_APR,   */
/*   if the first day of April is not a Sunday, (using Sunday as     */
/*   the first day of the week).                                     */
/*                                                                   */
/*                                                                   */
/* DST_END represents the end of daylight saving time and is         */
/* calculated similarly to DST_BEG.                                  */
/*********************************************************************/
data _null_;
  do year=2006 to 2009;
    fdoy=mdy(1,1,year);
    /* For years prior to 2007, daylight time begins in the United States on */
    /* the first Sunday in April and ends on the last Sunday in October.     */
    if year <= 2006 then do;
      fdo_apr=intnx('month',fdoy,3);
      dst_beg=intnx('week.1',fdo_apr,(weekday(fdo_apr) ne 1));
      fdo_oct=intnx('month',fdoy,9);
      dst_end=intnx('week.1',fdo_oct,(weekday(fdo_oct) in (6,7))+4);
    end;
    /* Due to the Energy Policy Act of 2005, Pub. L. no. 109-58, 119 Stat 594 */
    /* (2005).  Starting in March 2007, daylight time in the United States    */
    /* will begin on the second Sunday in March and end on the first Sunday   */
    /* in November.  For more information, one reference is                   */
    /* http://aa.usno.navy.mil                                                */
    else do;  
      fdo_mar=intnx('month',fdoy,2);
      dst_beg=intnx('week.1',fdo_mar, (weekday(fdo_mar) in (2,3,4,5,6,7))+1);
      fdo_nov=intnx('month',fdoy,10);
      dst_end=intnx('week.1',fdo_nov,(weekday(fdo_nov) ne 1));
    end;
    put dst_beg= worddate. /
    dst_end= worddate. / ;
  end;
run;

/* Sample 1: Variables for date, hour, minute and seconds */
data datetime;                           
  if _n_=1 then sdate=date();            
  retain sdate;                          
  format sasdt dateampm22. bid dollar6.0;
  input hr min sec bid dollar6.;         
  sasdt=dhms(sdate,hr,min,sec);          
  keep sasdt bid ;                                        
datalines;                               
8 00 25 $200                             
8 10 14 $300                             
9 24 30 $400                                                       
;                                        
run;   
/* Sample 2 : Variables for date and time */
data datetime;                           
  if _n_=1 then sdate=date();            
  retain sdate;                          
  format sasdt dateampm22. bid dollar6.0;
  input stime time8. +1 bid dollar6.; 
  /* Use zero placeholders for the H and M parameters */   
  sasdt=dhms(sdate,0,0,stime);           
  keep sasdt bid ;                                          
datalines;                                                         
10:30:30 $450                            
11:49:20 $465                            
13:44:12 $475                                                       
;run;


data ds1;
    do date='01nov2010'd to '31dec2010'd;
       output;
	end;
run;
/* The WEEK variable returns a value of 1 to 5 based on the number of weeks in a month 
using a combination of the INTNX and INTCK functions. 
Note:  
The INTCK function returns the integer number of time intervals in a given 
time span. By default, Sunday is the beginning of the week interval. 
The INTNX function increments (either forwards or backwards) a date, 
time or datetime value by a specified interval. 
*/
data ds2;
   set ds1;
   week=intck('week',intnx('month',date,0),date)+1;
run;
proc print;
   format date date9.;
run;


*finding the first business day of the mounth;
/* Create sample data */
data test;
  input date :mmddyy6.;
  format date date9.;
datalines;
010106
010406
041806
081806
123106
;
data getweek;
  set test;
  /* Use INTNX to roll DATE back to the first of the year. */
  /* Pass the result as the 'start' parameter to INTCK.    */
  week=intck('week',intnx('year',date,0),date)+1;
 /* If you are in SAS 9.1, you can use the WEEK function.  */
  /* The WEEK function has an optional second argument that */
  /* can be used to specify whether a week starts on Sunday */
  /* or Monday.  For more information, please refer to the  */
  /* SAS NLS User's Guide.                                  */
  /* U indicates Sunday is the first day of the week */
  week_function=week(date,'u'); 
run;

/* create sample data */
data one;
  input date mmddyy6.;
  format date date9.;
  cards;
011509 
021509 
030409 
;
data two;
  set one;
  /* advance date to the first day of the month using the INTNX function */
  first=intnx('month',date,0);
  /* determine the day of the week using the WEEKDAY function */
  day=weekday(first);
  /* if day=Sunday then advance by 1 */
  if day=1 then first+1;
  /* if day=Saturday then advance by 2 */
  else if day=7 then first+2;
  format first date9.;
proc print; 
  title 'First Business Day of the Month';
run;

/* Sample 1 -- Rolling dates forwards and backwards by month using the SAMEDAY */
/*             parameter new in SAS 9.1.  Do NOT 'roll over' to next month if  */
/*             the adjusted month has fewer days than the day value of the     */
/*             starting month.                                                 */    
data _null_;
  /* Test with non-leap year */
  do date='27MAR2003'd to '01APR2003'd;
    lastmonth= intnx('month',date,-1,'sameday');
    put (date lastmonth)(=worddate.);
  end;
  /* Test with leap year */
  put;
  do date='27MAR2004'd to '01APR2004'd;
    lastmonth=intnx('month',date,-1,'sameday');
    put (date lastmonth)(=worddate.);
  end;
  put;
  /* Test future dates */
  do date='27JAN2004'd to '01FEB2004'd;
    nextmonth=intnx('month',date,1,'sameday');
    put (date nextmonth)(=worddate.);
  end;
run;
/* Sample 2 -- Rolling dates forwards and backwards by month using the SAMEDAY */
/*             parameter new in SAS 9.1 while allowing shifted months with     */
/*             fewer days to 'roll over' to the next month.                    */
/*                                                                             */  
/* The default alignment of the INTNX function is the beginning of the shift   */
/* period, the first of the month in this case. If the resulting date is in a  */
/* month with less than 31 days, adjust the appropriate number of days into    */
/* the next month.                                                             */
data _null_;
 /* Test with non-leap year */
  do date='27MAR2003'd to '01APR2003'd;
    lastmonth=date - intnx('month',date,0)+intnx('month',date,-1);
    put (date lastmonth)(=worddate.);
  end;
  /* Test with leap year */
  put;
  do date='27MAR2004'd to '01APR2004'd;
    lastmonth=date - intnx('month',date,0)+intnx('month',date,-1);
    put (date lastmonth)(=worddate.);
  end;
  put;
  /* Test future dates */
  do date='27JAN2004'd to '01FEB2004'd;
    nextmonth=date - intnx('month',date,0)+intnx('month',date,1);
    put (date nextmonth)(=worddate.);
  end;
run

【上篇】
【下篇】

抱歉!评论已关闭.