我正在将一个csv文件导入SAS,其中包含一个字段,该字段使用类似于worddatxw的字日期格式。但是在日期之后用字母表示(例如1号而不是1号):
Week_of_the_promotion
1st April 2013
1st April 2013
3rd April 2013
3rd April 2013
5th April 2013
我到目前为止:
data work.leafletdata;
infile "C:\rawdata.csv"
delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2;
informat
Week_of_the_promotion *weird informat?* Barcode $20.
StartDate mmddyy10. EndDate mmddyy10. ;
format
Week_of_the_promotion *preferably date9.* Barcode $20.
StartDate date9. EndDate date9. ;
input
Week_of_the_promotion $ Barcode $
StartDate $ EndDate $ ;
run;
我无法弄清楚如何使用proc导入将其导入SAS,并在SAS内部将其转换为可用日期。
我是SAS初学者,所以请使用外行的条款。谢谢! :)
答案 0 :(得分:2)
这是一种可能的解决方案 - 将其分解为“1st”“April”“2013”,然后从“April”“2013”构建日期,最后使用“1st”和intnx
函数提前几周。您可能需要调整intnx
的调用,具体取决于您如何定义“四月的第一周”(例如,在3/31开始的示例中,如果您的公司将其定义为从4/7到4/13这是不同的,如果您需要一周开始在一周的另一天也进行调整 - 请查看documentation以获取更多信息。
data have;
infile datalines truncover;
input @1 week_of_the_promotion $25.;
datalines;
1st April 2013
1st April 2013
3rd April 2013
3rd April 2013
5th April 2013
;;;;
run;
data want;
set have;
weeknum = compress(scan(week_of_the_promotion,1),,'kd'); *Note 1;
for_date = '01'||substr(scan(week_of_the_promotion,2),1,3)||
scan(week_of_the_promotion,3); *Note 2;
actual_date = intnx('week',input(for_date,date9.),weeknum-1,'b'); *Note 3;
format actual_date date9.;
put week_of_the_promotion= actual_date=;
run;
Scan
通过分隔符(默认空格)将字符串分隔为单词,并返回您要求的单词(1,此处)。 Compress
删除/保留特定种类的字符;在这里我用它来“保持”“数字”。所以scan
返回“1st”然后我告诉它只保留数字,所以“1”。scan
两次,获得“四月”和“2013”。四月使用substr切换到前三个字符“Apr”,因为这是SAS日期最容易阅读的方式。然后我们将年份追加到最后,并将“01”追加到开头(第一天......)。最终为“01APR2013”,然后input
使用日期信息来表示数字(DDMONYYYY是SAS在/格式中的默认日期)。intnx
,它会将日期提前一定数量的日期间隔。我们使用“周”来推进它一定数周,并推进存储在“weeknum”(从注释1)减去1的数字(从第1周开始=提前0周,第2周=提前1周等) “b”是一周的“开始”(而不是“结束”或“中间”或“相同”)。 “周”是从周日开始的默认周; WEEK.2将向前推进两天,从星期二开始,等等。