date - 将 csv 导入 SAS 时无法正确设置日期格式

标签 date sas

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

关于date - 将 csv 导入 SAS 时无法正确设置日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998212/

相关文章:

php - 使用 PHP 从 MySQL 打印两个日期之间的 Y-m-d 业务日期列表

sql - SAS 中的 PROC SQL - 所有项目对

sas - 如何在SAS中查找变量的前一个值

sql - SAS 直通 SQL - 多个数据库

SAS 将结果输出到输入数据集(输入和输出数据集名称相同)

date - 如何在SAS中将日期格式d.m.yyyy转换为dd.mm.yyyy?

java - 将三个 LocalDate 转换为 YearMonth

Javascript 获取数组中的连续日期

javascript - 通过 Javascript 添加迄今为止的小时、分钟和秒,然后显示在标题上

sas - 读取包含字符和带百分号的数字的列