SAS无效“闰年”日期问题yymmdd8 [英] SAS invalid 'leap year' date issue yymmdd8

查看:538
本文介绍了SAS无效“闰年”日期问题yymmdd8的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在读一些有几个坏日期的原始数据。具体来说,有人在闰年中键入了二月二十九日。例如:

  data _null_; 
输入测试:yymmdd8。
格式测试date9。
卡;
20270229
运行;

客户希望这可以恢复到2月28日。有没有一个快速/有效的做法这个?例如:



IF iserror(date)then date = date-1; ?



任何建议感激不尽!

解决方案

我会有点更仔细的修复日期。这里是一种方式。 hth。

 %put sysvlong =& sysvlong sysscpl =& sysscpl; 
/ * sysvlong = 9.02.01M0P020508 sysscpl = W32_VSPRO * /

/ *将字符(temp)和数字(日期)读取。
如果数字日期丢失,则检查
字符日期是否以0229结尾,如果是,则将
更改为0228,并查看是否为有效日期。
如果OK,那就是这样。否则,保持丢失。 * /
%让FEB29 = 0229;
%让FEB28 = 0228;
数据一;
drop temp;
输入temp $ char8。 @ 1日期? yymmdd8;
如果缺少(日期)然后链接修复;
格式日期b8601da .;
put(_all_)(=);
return;
fix:
如果length(strip(temp))^ = 8然后返回;
如果substr(temp,5)^ =& FEB29则返回;
date = input(cat(substr(temp,1,4),& FEB28),?? yymmdd8。
return;
卡;
20080229 ok
20090229应该更改为28th
201XX229这应该丢失
20110229 - > 28
20120229 ok
20130229 - > 28
20270229 - > 28
;
运行;

/ * on log
temp = 20080229 date = 20080229
temp = 20090229 date = 20090228
temp = 201XX229 date =。
temp = 20110229 date = 20110228
temp = 20120229 date = 20120229
temp = 20130229 date = 20130228
temp = 20270229 date = 20270228
注意:数据集WORK .ONE有7个观察值和1个变量。
* /


I am reading in some raw data that has a couple of bad dates. Specifically, someone has keyed in "29th Feb" on a NON leap year. For example:

data _null_;
input test :yymmdd8.;
format test date9.;
cards;
20270229
run;

The customer would like this to revert to the 28th Feb. Is there a quick / efficient method of doing this? eg an equivalent of:

IF iserror(date) then date=date-1; ?

Any suggestions gratefully received!

解决方案

I would be a bit more careful fixing dates. here is one way. hth.

%put sysvlong=&sysvlong sysscpl=&sysscpl;           
/* sysvlong=9.02.01M0P020508 sysscpl=W32_VSPRO */

/* read a date both as character(temp) and numeric(date).
   if the numeric date is missing then check if the
   character date ends with "0229," if so, then change it
   to "0228" and see if it is a valid date. 
   If OK, then that is it. otherwise, keep it missing. */
%let FEB29 = 0229; 
%let FEB28 = 0228;
data one;
  drop temp;
  input temp $char8. @1 date ?? yymmdd8.;
  if missing(date) then link fix;
  format date b8601da.;
  put (_all_) (=);
  return;
fix:
  if length(strip(temp))^=8 then return;
  if substr(temp,5) ^= "&FEB29" then return;
  date = input(cat(substr(temp,1,4), "&FEB28"), ?? yymmdd8.);
return;
cards;
20080229  ok
20090229  should be changed to 28th
201XX229  this should be missing
20110229  -> 28
20120229  ok 
20130229  -> 28
20270229  -> 28
;
run;

/* on log
temp=20080229 date=20080229
temp=20090229 date=20090228
temp=201XX229 date=.
temp=20110229 date=20110228
temp=20120229 date=20120229
temp=20130229 date=20130228
temp=20270229 date=20270228
NOTE: The data set WORK.ONE has 7 observations and 1 variables.
*/

这篇关于SAS无效“闰年”日期问题yymmdd8的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆