Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 将字符日期转换为格式化日期_Date_Sas - Fatal编程技术网

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的转换步骤。使用不同的信息可能会容易得多,而将数字(外观)月号转换为缩写的月名可能会非常麻烦。这已在前面的问题中介绍过,你没有包括答案中的格式陈述。这在上一个问题中已经涉及,你没有包括答案中的格式陈述。