我有一个非常大的表,其中包含一个索引日期时间字段。我希望按月对数据集进行分组处理,并且只输出每个月的最后一次观察。
问题是它不包含月份字段,所以我不能使用这样的东西:
if last.month then do;
output;
end;
有没有办法可以实现这种行为而无需在之前的datastep中添加月份字段?该表是50 gig压缩,所以我想避免任何不必要的步骤。
由于
答案 0 :(得分:7)
您可以使用'groupformat'对原始数据集实际实现此目的,将datetime字段格式化为'dtmonyy5'。顾名思义,这个按格式化值而不是原始值进行分组。
data new1;
set old;
format datetime dtmonyy5.;
by groupformat datetime;
if last.datetime;
run;
另一种方法是使用Proc Summary,尽管这可能是内存密集型的,特别是对大型数据集。这是代码。
proc summary data=old nway;
class datetime;
format datetime dtmonyy5.;
output out=new2 (drop=_:) maxid(datetime(_all_))=;
run;
只需快速记下上一个答案,'月'功能对日期字段起作用,而不是日期时间,因此您需要将datepart函数添加到该行。
month = month(datepart(datetime));
答案 1 :(得分:4)
使用数据视图这是一个很好的情况。这允许您添加在处理数据集时即时创建的变量,而无需创建新的物理数据集。
data new / view=new;
set old;
month = month(datepart(datetime));
run;
如果你运行它,你会发现处理时间不到一秒,所以你知道它没有生成一个新的50 GB数据集。但您可以将数据视图new
与您的代码一起使用,就像它是一个数据集一样。