【发布时间】:2018-02-05 15:27:13
【问题描述】:
早安,
我希望将两个日期合并到下一个最接近的日期。
数据集从 500Mb 到 1G 都是巨大的,所以proc sql 是不可能的。
我有两个数据集。第一个(舰队)有观察结果,第二个有日期和用于进一步处理的代号。像这样:
data Fleet
CreatedPortalDate
2013/2/19
2013/8/22
2013/8/25
2013/10/01
2013/10/07
data gennum_list
date
01/12/2014
08/12/2014
15/12/2014
22/12/2014
29/12/2014
...
我想要的是这样的链接表:
data link_table
CreatedPortalDate date
14-12-03 01/12/2014
14-12-06 01/12/2014
14-12-09 08/12/2014
14-12-11 08/12/2014
14-12-14 08/12/2014
有逻辑的
Date < CreatedPortalDate and (CreatedPortalDate - date) = min(CreatedPortalDate - date)
我想出的东西有点笨拙,我正在寻找一种有效/更好的方法来实现这一点。
data all_comb;
set devFleet(keep=createdportaldate);
do i=1 to n;
set gennum_list(keep=date) point=i nobs=n;
if createdportaldate > date
and createdportaldate - 15 < date then do;/*Assumption, the generations are created weekly.*/
distance= createdportaldate - date;
output;
end;
end;
run;
proc sort data=all_comb; by createdportaldate distance; run;
data link_table;
set _all_comb(drop=distance);
by createdportaldate;
if first.createdportaldate;
run;
- 任何想法如何改进或解决这个问题?
- 无知的想法:我可以创建存储
distance的哈希表吗? - 可能是数组?以某种方式。
编辑:
-
通用格式
- 完成
-
十亿行从何而来?
- 是的,还涉及其他数据,但日期是唯一的链接变量。
-
排序了吗?
- 是的,数据已排序,可以再次排序。
-
gen num 日期总是相隔 7 天吗?
- 没有。这是棘手的部分。否则我可以使用
week和year(或其他分箱)作为唯一标识符。
- 没有。这是棘手的部分。否则我可以使用
【问题讨论】:
-
请编辑,以便显示的日期都是通用格式,例如 yyyy-mm-dd。您仅在示例数据中列出唯一的日期值。 100 年只有约 36,500 天。十亿行从何而来?是否涉及其他列,例如帐户 ID?显示的样本数据已排序。真实数据是否排序? gen num 日期总是相隔 7 天吗?
-
@Richard 更新了问题。