SAS:在宏中从开始日期到结束日期进行迭代

黑场

我有一个像这样的数据集:

DATA tmp;
    INPUT
        identifier $
        d0101 d0102 d0103 d0104 d0105 d0106
        d0107 d0108 d0109 d0110 d0111 d0112
    ;
    DATALINES;
    a 1 2 3 4 5 6 7 8 9 10 11 12
    b 4 5 7 4 5 6 7 6 9 10 3 12
    c 5 2 3 5 5 4 7 8 3 1 1 2
    ;
RUN;

我正在尝试创建一个像这样的数据集:

DATA tmp;
    INPUT
        identifier $ day value
    ;
    DATALINES;
    a '01JAN2018'd 1
    a '02JAN2018'd 2
    a '03JAN2018'd 3
    a '04JAN2018'd 4
    a '05JAN2018'd 5
    a '06JAN2018'd 6
    a '07JAN2018'd 7
    a '08JAN2018'd 8
    a '09JAN2018'd 9
    a '10JAN2018'd 10
    a '11JAN2018'd 11
    a '12JAN2018'd 12
    b '01JAN2018'd 4
    b '02JAN2018'd 5
    b '03JAN2018'd 7
    ...
    ;
RUN;

我知道“融化”这样的数据集的语法-我已经完成了一个类似的宏,用于表示一年中十二个月中的每个月中特定值的列。

我正在努力的是如何从have年初至今遍历整天(假设数据集将年初至今的整天都作为列)。

我已经习惯了Python,所以我可能会做一些事情:

>>> import datetime
>>> 
>>> def dates_ytd():
...     end_date = datetime.date.today()
...     start_date = datetime.date(end_date.year, 1, 1)
...     diff = (end_date - start_date).days
...     for x in range(0, diff + 1):
...         yield end_date - datetime.timedelta(days=x)
... 
>>> def create_date_column(dt):
...     day, month = dt.day, dt.month
...     day_fmt = '{}{}'.format('0' if day < 10 else '', day)
...     month_fmt = '{}{}'.format('0' if month < 10 else '', month)
...     return 'd{}{}'.format(month_fmt, day_fmt)
... 
>>> result = [create_date_column(dt) for dt in dates_ytd()]
>>> 
>>> result[:5]
['d1031', 'd1030', 'd1029', 'd1028', 'd1027']
>>> result[-5:]
['d0105', 'd0104', 'd0103', 'd0102', 'd0101']

这是我的SAS尝试:

%MACRO ITER_DATES_YTD();
    DATA _NULL_;
        %DO v_date = '01012018'd %TO TODAY();
            %PUT d&v_date.;
            * Will do "melting" logic here";
        %END
%MEND ITER_DATES_YTD;

当我使用运行此命令时,%ITER_DATES_YTD();什至没有任何内容被打印到我的日志中。我在这里想念什么?我基本上是通过“YTD”栏目要迭代,像这样的d0101d0102d0103...

理查德

与宏/数据步长问题相比,这更是一个转置问题。

核心问题是元数据中有数据,这意味着“日期”被编码在列名中。

范例1:

转置数据,然后使用这些d<yymm> _name_值计算实际日期。

proc transpose data=have out=have_t(rename=col1=value);
  by id;
run;

data want (keep=id date value);
  set have_t;

  * convert the variable name has day-in-year metadata into some regular data;
  date = input (cats(year(today()),substr(_name_,2)),yymmdd10.);

  format date yymmdd10.;
run;

范例2:

进行基于数组的转置。这些D<mm><dd>变量以value_at_date的角色使用,并且由于一致的命名约定而易于排列。VNAME函数从数组引用中提取原始变量名,并从该<mm><dd>部分计算日期值

data want;
  set have;
  array value_at_date d:;

  do index = 1 to dim(value_at_date);
    date = input(cats(year(today()),substr(VNAME(value_at_date(index)),2)), yymmdd10.);
    value = value_at_date(index);
    output;
  end;

  format date yymmdd10.;
  keep id date value;
run;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中从开始日期到结束日期生成日期

开始日期和结束日期的 Sas 循环

SQL多个开始日期到结束日期

从开始日期到结束日期 Java 的周数

连续运行的SAS开始和结束日期

日期范围中的开始和结束日期

Bootstrap中的开始日期和结束日期

AngularJS中的开始日期和结束日期

从开始日期到结束日期的每个日期的行

从开始日期到结束日期的每个日期生成行

在 Azure Devops 中,如何创建显示迭代开始日期和结束日期的查询?

如何遍历一类开始和结束日期时间,将每个日期范围之间的天数与每次迭代一起存储到列表中?

在 Haskell 中创建从开始/结束日期开始的日期列表

在MySQL中按开始日期和/或结束日期对事件进行排序

按开始日期和结束日期对列表中的元素进行分组或过滤

如何从列表中获取从开始日期到结束日期的数据表的行?

使用开始日期和结束日期列进行重新采样

熊猫date_range从结束日期到开始日期

设置开始日期和结束日期以存储到 Firebase 云中?

从表格中获取开始日期和结束日期,并按ID和状态类型对日期进行分组

为什么使用循环从数组的开始到结束进行迭代要比从开始到结束以及从结束进行迭代要快?

在两个日期(包括开始日期)之间进行迭代?

TFS在PBI上显示迭代的开始和结束日期

如何使用时刻迭代周数,周的开始/结束日期

如何使用时刻迭代周数,周的开始/结束日期

SAS宏日期发布

开始日期和结束日期的数组,其中进行的开始日期 = 上一个结束日期 +1 WORKDAY

从SQL中的开始日期列表中获取结束日期

结束日期与开始日期之间的日期差