SAS-对连续日期进行分组并查找每组的计数
SAS- Grouping consecutive dates and finding the count for each group
只是想找到最有效的方法。如果您查看下面的日期列,您会发现两个连续的组,其中第一组的最后日期为 2018-01-04,总数为 4,第二组的最后日期为 2018-01-13总数也是 4。
我的最终目标是获取最新组或最新连续天数。
已编辑:我想要 table 显示每个不同的帐户 ID,以显示最近连续几天的总计数。
例如。帐户编号:100012345 total_count_consec_days:400
帐户 ID:是唯一的
total_count_consec_days:该帐户 ID 的最新一组连续天数。
---日期---
2018-01-01
2018-01-02
2018-01-03
2018-01-04
2018-01-10
2018-01-11
2018-01-12
2018-01-13
我正在处理 4000 个不同的帐户,每个帐户平均有 500 个日期。如果没有有效的方法,那么我很乐意接受任何有助于我获得最终结果的帮助。请帮忙!!
谢谢!
假设数据按 accountid
和 date
排序,对组进行简单的 DOW 循环可以发现并输出最近 'run' 个连续日期的特征。
示例数据
500 个账户,有几百个日期,从大约 3 年前开始,随机输出。每42记长篇运行过去完结被逼
data have(keep=accountid date);
do accountid = 1 to 500;
stopdate = .;
do date = today()-1000 to today();
if mod(accountid,42) = 0 then do;
if missing(stopdate) then stopdate = today()-100 * ranuni(123);
if today()-500 < date < stopdate then output;
end;
else
if ranuni(123) > 0.15 and date < today() - accountid/10 then
output;
end;
end;
format date stopdate yymmdd10.;
run;
示例代码
对于每个帐户,检测并输出最近 'run' 个连续日期的特征
data want (keep=accountid last_:);
do _n_ = 1 by 1 until (last.accountid);
set have;
by accountid date;
if dif(date) > 1 or _n_ = 1 then do; start_n = _n_; start_date = date; end;
end;
last_run_length = _n_ - start_n + 1;
last_run_start_date = start_date;
last_run_end_date = date;
format last_run_start_date last_run_end_date yymmdd10.;
run;
只是想找到最有效的方法。如果您查看下面的日期列,您会发现两个连续的组,其中第一组的最后日期为 2018-01-04,总数为 4,第二组的最后日期为 2018-01-13总数也是 4。
我的最终目标是获取最新组或最新连续天数。
已编辑:我想要 table 显示每个不同的帐户 ID,以显示最近连续几天的总计数。
例如。帐户编号:100012345 total_count_consec_days:400
帐户 ID:是唯一的
total_count_consec_days:该帐户 ID 的最新一组连续天数。
---日期---
2018-01-01
2018-01-02
2018-01-03
2018-01-04
2018-01-10
2018-01-11
2018-01-12
2018-01-13
我正在处理 4000 个不同的帐户,每个帐户平均有 500 个日期。如果没有有效的方法,那么我很乐意接受任何有助于我获得最终结果的帮助。请帮忙!!
谢谢!
假设数据按 accountid
和 date
排序,对组进行简单的 DOW 循环可以发现并输出最近 'run' 个连续日期的特征。
示例数据
500 个账户,有几百个日期,从大约 3 年前开始,随机输出。每42记长篇运行过去完结被逼
data have(keep=accountid date);
do accountid = 1 to 500;
stopdate = .;
do date = today()-1000 to today();
if mod(accountid,42) = 0 then do;
if missing(stopdate) then stopdate = today()-100 * ranuni(123);
if today()-500 < date < stopdate then output;
end;
else
if ranuni(123) > 0.15 and date < today() - accountid/10 then
output;
end;
end;
format date stopdate yymmdd10.;
run;
示例代码
对于每个帐户,检测并输出最近 'run' 个连续日期的特征
data want (keep=accountid last_:);
do _n_ = 1 by 1 until (last.accountid);
set have;
by accountid date;
if dif(date) > 1 or _n_ = 1 then do; start_n = _n_; start_date = date; end;
end;
last_run_length = _n_ - start_n + 1;
last_run_start_date = start_date;
last_run_end_date = date;
format last_run_start_date last_run_end_date yymmdd10.;
run;