转发
间隔函数INTNX和INTCK
1. 函数语句的基本格式:
(1)INTNX:按间隔递增日期
INTNX(interval, from, n)
Interval: 一个包含间隔名的字符常量或变量
From:一个SAS日期,或者日期时间值
n: 是从包含from日期的间隔要递增的间隔数
(2)INTCK:计算两个日期或者日期时间值的间隔界限数
INTCK(interval, from, to)
Interval: 一个包含间隔名的字符常量或变量
From: 为开始日期或开始日期时间值
To: 为结束日期或结束日期时间值
2.应用
(1)按一定间隔增加日期
INTNX函数的一个实际的用法是生成周期日期值。例如对于一个消费价格指数数据,在记录的时候没有记录相应的时间,但是知道第一个观测是1990年6月,用INTNX函数可以实现对每个观测计算出ID变量DATE。
Data uscpi:
Input cpi;
Date=intns(‘month’,’1jun90’,_n_-1);
Format date monyy;
Cards;
129.0
130.4
……
;
Run;
(2)把日期标准化到时间间隔的开始
要想把日期统一到间隔的开始,可以调用增量为0的INTNX函数,增量为0的INTNX函数计算间隔第一天的日期。
例如:INTNX(‘month’, ‘17oct91’D,0)返回日期’1oct91’D。
把月中值改为月初值
Data uscpi;
Input date date. Cpi;
Format date monyy.;
Date=intnx(‘month’,date,0);
Cards;
15jun90 129.0
15jul90 130.4
15aug90 131.6
……
;
Run;
(3)计算时间间隔的宽度
计算一个时间间隔的宽度,可以用下一个时间间隔的ID值减去本间隔开始的ID值。
(4)计算时间间隔的结束日期或中点
计算间隔结束的日期,只要计算下一个间隔的开始日期再减去1(SAS日期是按天数计算的)。
计算时间间隔的中点的日期,可以计算间隔的第一天和最后一天的平均值。也可以用SEMIMONTH的INTNX函数。
例如:
Mon15_1=mdy(month(date),15,year(date));
Date=intnx(‘month’,date,0);
Mon15_2=date+14;
Mon15_3=intnx(‘day’,date,14);
Mon15_4=intnx(‘semimonth’,date,1)-1;
(5)计算时间间隔的顶部
为了使日期移动到下一间隔的开始(如果日期已经是间隔的开始,则不移动),可以从日期值中减去1然后再用INTNX函数把日期前进一个间隔。例如:newyear=intnx(‘year’,date-1,1)
(6)计算时间间隔数目
用INTCK函数可以计算两个日期之间的间隔界限个数。需要注意的是:INTCK计算的是从第一个日期移动到第二个日期的过程中经历的间隔始点的个数。并不计算两个日期之间完整的间隔的个数。
例 用函数INTCK计算每个月份的星期天、星期一、星期二等的个数。
Data uscpi;
Set uscpi;
D0=intnx(‘month’,date,0)-1;
D1=intnx(‘month’,date,1)-1;
Nsunday=intck(‘week.1’,d0,d1);
Nmonday=intck(‘week.2’,d0,d1);
Ntuesday=intck(‘week.3’,d0,d1);
Drop d0 d1;
Run;
(7)检查数据的周期性
加入有一时间序列数据集,想核实数据的周期性是否正确,观测值的日期标记是否正确,以及数据集是否按日期排序,可以使用INTCK函数去比较当前观测值的日期和前一观测值的日期并核实日期是否落在顺序的时间间隔中。
例 下面的语句核实数据集uscpi是正确地表明日期的月纪录数据集。语句retain用于保留观测值的日期,儿自动变量_N_用于启动对第二个观测值的核实过程。
Data _null_;
Set uscpil;
Retain prevdate;
If _N_>1 than
If intck(‘month’,prevdate,date)^=1 then
Put “bad date sequence at observation number” _N_;
Prevdate=date;
Run;
(8)填充时间序列数据集中的删失值
可以通过把带有丢失观测值的时间序列数据集于包含完全的日期序列的数据集合并从而替代删失观测值。
(9)在日历计算中使用间隔函数
可以用INTNX和INRCK函数的公式和不同的间隔类型去完成几乎所有的日历计算。
例1 假如想知道1991年10月的第三个星期三是几号,可以如下计算:
Intnx(‘week.4’,’1oct91’D-1,3)
例2 从1991年10月17日开始到1991年11月第二个星期五为止的时间内有多少个周日?
下面的公式计算从变量date中所含日期值开始到下一个月的第二个星期五为止的时间内的周日数。
n=intck(‘weekday’,date-1,intnx(‘week.6’,intnx(‘month’,date,1)-1,2)+1)