Date 将字符日期转换为格式化日期
我有以下数据集,Date 将字符日期转换为格式化日期,date,sas,Date,Sas,我有以下数据集,date中的值是通用格式的mmyy: DATA df; INPUT date $; DATALINES; d0101 d0102 d0103 d0104 ; RUN; 我希望df中的每一行都变成以下(数字/日期类型): 以下是我的尝试: DATA df_new; SET df; FORMAT date DATE9.; date = INPUT(SUBSTR(date, 2, 2) || PUT(INPUT(SUBSTR(date, 4, 2), 8.
date
中的值是通用格式的mmyy
:
DATA df;
INPUT date $;
DATALINES;
d0101
d0102
d0103
d0104
;
RUN;
我希望df
中的每一行都变成以下(数字/日期类型):
以下是我的尝试:
DATA df_new;
SET df;
FORMAT date DATE9.;
date = INPUT(SUBSTR(date, 2, 2) || PUT(INPUT(SUBSTR(date, 4, 2), 8.), MONNAME3.) || PUT(YEAR(TODAY()), 4.), DATE9.);
RUN;
然而,这给了我以下几点:
21185
21185
21185
21185
如何完成此转换?您正在应用一种格式,但date变量仍然包含数值(自SAS Epoch以来的天数)。 您还错误地重用了日期变量。在df数据集中,它被创建为字符,在df_new中,您正在向它写入一个数值。因此,要修复它,请在df_new数据集中将date更改为dateN。最后,要将其转换为字符,您还需要执行一个步骤:
...
dateN = input(substr(date, 2, 2) || put(input(substr(date, 4, 2), 8.), monName3.) || put(year(today()), 4.), date9.);
length dateC $9;
dateC = put(dateN, date9.)
...
您正在应用一种格式,但是date变量仍然包含数值(自SAS纪元以来的天数)。 您还错误地重用了日期变量。在df数据集中,它被创建为字符,在df_new中,您正在向它写入一个数值。因此,要修复它,请在df_new数据集中将date更改为dateN。最后,要将其转换为字符,您还需要执行一个步骤:
...
dateN = input(substr(date, 2, 2) || put(input(substr(date, 4, 2), 8.), monName3.) || put(year(today()), 4.), date9.);
length dateC $9;
dateC = put(dateN, date9.)
...
下面使用mdy函数并应用date9。从mdy函数创建日期后设置格式,创建日期可能需要年月日 你也可以使用
new_date=mdy(substr(date,2,2), substr(date,4,2), year(today()));
但它会在您的日志中显示以下消息
NOTE: Character values have been converted to numeric values at the places
given by: (Line):(Column).
下面使用mdy函数并应用date9。从mdy函数创建日期后设置格式,创建日期可能需要年月日 你也可以使用
new_date=mdy(substr(date,2,2), substr(date,4,2), year(today()));
但它会在您的日志中显示以下消息
NOTE: Character values have been converted to numeric values at the places
given by: (Line):(Column).
这个转变与我在你的另一个问题中回答的完全相同 无需提取具有假定结构的字符串中的数字方面
d
,以馈送到MDY
。相反,充实日期的字符串表示形式,并使用带有日期信息的input
来建立SAS日期值(这只是一个数字,表示自SAS日期纪元(1960年1月1日)以来的天数)。SAS日期值根据格式呈现。如果未格式化,则只会看到一个整数。将变量格式化为date9.
将导致输出呈现相应的
,或格式化yymdd10.
将呈现为--
或者更明确地说
year_string = cats(year(today());
mmdd_string = substr(date,2);
yyyymmdd_string = cats(year_string,mmdd_string);
date_value = input(yyyymmdd_string, yymmdd10.);
format date_value date9.;
如果绝对需要(不太可能)将呈现为字符串的日期存储回原始日期变量,则必须使用put
在赋值时强制呈现
date = put(date_value, date9.);
这个转变与我在你的另一个问题中回答的完全相同 无需提取具有假定结构的字符串中的数字方面
d
,以馈送到MDY
。相反,充实日期的字符串表示形式,并使用带有日期信息的input
来建立SAS日期值(这只是一个数字,表示自SAS日期纪元(1960年1月1日)以来的天数)。SAS日期值根据格式呈现。如果未格式化,则只会看到一个整数。将变量格式化为date9.
将导致输出呈现相应的
,或格式化yymdd10.
将呈现为--
或者更明确地说
year_string = cats(year(today());
mmdd_string = substr(date,2);
yyyymmdd_string = cats(year_string,mmdd_string);
date_value = input(yyyymmdd_string, yymmdd10.);
format date_value date9.;
如果绝对需要(不太可能)将呈现为字符串的日期存储回原始日期变量,则必须使用put
在赋值时强制呈现
date = put(date_value, date9.);
“您也错误地重用了
日期
变量”是什么意思?这取决于具体情况,但在SAS中,您通常不希望用数值覆盖字符变量,反之亦然。虽然SAS会自动将其隐藏,但在这种情况下很容易出错。因此,您将对字符变量应用“DATE9.”格式,这是一种数字格式,这就是为什么您看到整数(作为字符串)而不是格式化日期的原因。即使看到格式化的日期,实际的原始值始终是数字。这就是需要使用PUT的转换步骤的原因。使用不同的信息可能会容易得多,而将数字(看起来)的月数转换为缩写的月名可能会非常麻烦。什么是“您还错误地重用了<代码>日期代码>变量”?这取决于具体情况,但在SAS中,通常不希望用数值覆盖字符变量,反之亦然。虽然SAS会自动将其隐藏,但在这种情况下很容易出错。因此,您将对字符变量应用“DATE9.”格式,这是一种数字格式,这就是为什么您看到整数(作为字符串)而不是格式化日期的原因。即使看到格式化的日期,实际的原始值始终是数字。这就是为什么需要使用PUT的转换步骤。使用不同的信息可能会容易得多,而将数字(外观)月号转换为缩写的月名可能会非常麻烦。这已在前面的问题中介绍过,你没有包括答案中的格式陈述。这在上一个问题中已经涉及,你没有包括答案中的格式陈述。