2

我正在将一个 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 import 将其导入 SAS 并在 SAS 中将其转换为可用日期。

我是 SAS 初学者,所以请使用外行的术语。谢谢!:)

4

1 回答 1

2

这是一种可能的解决方案 - 将其分解为“1st”“April”“2013”​​,然后从“April”“2013”​​构造一个日期,最后使用“1st”和intnx函数来提前该周数。您可能需要intnx根据您定义“4 月的第一周”的方式调整呼叫(例如,在从 3/31 开始的示例中,如果您的公司将其定义为从 4/7 到 4/13 的那一周,那就不同了,如果您需要从一周中的不同日期开始一周,这也是一种调整 - 请查看文档以获取更多信息)。

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;
  1. Scan通过分隔符将字符串分隔为单词,默认为空格,并返回您要求的单词(1,此处)。 Compress删除/保留特定类型的字符;在这里,我用它来“保留”“数字”。所以scan返回“1st”,然后我告诉它只保留数字,所以“1”。
  2. 这里我们使用scan了两次,得到“April”和“2013”​​。April 使用 substr 剪切为前 3 个字符“Apr”,因为这是最容易读取 SAS 日期的方式。然后我们将年份附加到末尾,并将“01”附加到开头(对于...的第一天)。这最终是“01APR2013”​​,然后input将日期信息用于数字(DDMONYYYY 是 SAS 的默认日期/格式)。
  3. 我们intnx在这里使用,它将日期提前一定数量的日期间隔。我们使用“week”将其提前一定周数,并将存储在“weeknum”中的数字(来自注释1)减去1(因为第1周=提前0周,第2周=提前1周等) “b”是一周的“开始”(与“结束”或“中间”或“相同”相反)。“周”是从星期日开始的默认周;WEEK.2 会将这两天向前移动到从星期二开始的几周,等等。
于 2013-08-01T16:12:34.513 回答