如何创建日期之间的变量



我正在努力创建间隔日期的财政年度变量。我想要诸如1819(对于2018/19财年)等变量。

data mydata;
set mydata;
FinYear = 9999.;
if '01JUL2018'd <= ConductedDate <= '30JUN2019'd then FinYear=1819;
run;

我做错了什么吗?

不知道你做错了什么,但是,不管怎样,这是一个更好的方法。注意,这假定您的输入变量是一个数字日期变量,而不是一个字符变量——请检查一下!如果是字符变量,则需要将其输入到数字日期变量。

首先我们制作一些假数据-你不应该需要这一步:

data have;
format datevar date9.;
do datevar = '02JAN2017'd to '01FEB2021'd by 20;
output;
end;
run;

现在我们使用INTNX(时间间隔增量函数)与YEAR.7间隔(YEAR,但移位7 -在本例中是7个月-因此是每年7月1日)并从中提取YEAR()。最后,我们使用模(余数)函数进行一些数学运算以获得您的确切值(从该日期的年份组成部分),抓住最后两位数并将其加一。

data want;
set have;
fy_start = year(intnx('year.7',datevar,0));
finyear = cats(mod(fy_start,100),mod(fy_start+1,100));
run;

我要注意的是,我不是特别喜欢这样做——有更好的方法,特别是使用格式,在实际生成原始数据值时显示日期值是哪个财政年度。

proc format;
value finyr
'01JUL2016'd - '30JUN2017'd = '1617'
'01JUL2017'd - '30JUN2018'd = '1718'
'01JUL2018'd - '30JUN2019'd = '1819'
'01JUL2019'd - '30JUN2020'd = '1920'
'01JUL2020'd - '30JUN2021'd = '2021'
'01JUL2021'd - '30JUN2022'd = '2122'
;
quit;
data want;
set have;
format datevar finyr.;
run;

如果你真的需要一个值,你当然可以使用PUT (newval = put(datevar finyr.);)

)可以使用CNTLIN数据集以编程方式生成格式,而不是像上面那样手工生成,以避免每年更新。

您可以尝试将第4行代码修改为:

data mydata;
set mydata;
FinYear = 9999.;
if '01JUL2018'd <= ConductedDate and ConductedDate <= '30JUN2019'd then FinYear=1819;
run;

感谢

最新更新