我正在将 csv 文件导入 SAS,其中包含一个使用类似于 worddatxw 的单词日期格式的字段。但在日期之后带有字母(例如 1st 而不是 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 import 将其导入 SAS 并在 SAS 中将其转换为可用日期。
我是 SAS 初学者,所以请使用外行术语。谢谢! :)
最佳答案
这是一种可能的解决方案 - 将其分解为“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)。压缩
删除/保留特定类型的字符;这里我用它来“保留”“数字”。因此scan
返回“1st”,然后我告诉它只保留数字,即“1”。- 这里我们使用
scan
两次,以获取“April”和“2013”。使用 substr 将 April 剪切到前 3 个字符“Apr”,因为这是 SAS 日期最容易读取的方式。然后我们将年份附加到末尾,并将“01”附加到开头(表示......中的第一天)。最终结果是“01APR2013”,然后使用日期信息将其输入
为数字(DDMONYYYY 是 SAS 的默认日期格式)。 - 我们在这里使用
intnx
,它将日期提前一定数量的日期间隔。我们使用“week”将其提前一定周数,并将“weeknum”中存储的数字(来自注释1)提前减去1(因为第1周=提前0周,第2周=提前1周,等等) “b”是一周的“开始”(与“结束”、“中间”或“相同”相对)。 “Week”是默认的一周,从周日开始; WEEK.2 会将其向前移动两天,即从周二开始的几周,依此类推。
关于date - 将 csv 导入 SAS 时无法正确设置日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998212/