使用 ISO 8601 表示法创建自定义 SAS 日期时间格式
Creating a custom SAS date time format using ISO 8601 notation
我在 SAS table 中有一个字符变量,它填充了非常规类型的日期时间。实际上,它具有以下格式:YYYY-MM-DDT00:00:00.000+00:00
。这是一个例子:2020-01-01T00:00:00
.
我想将此字符列转换为日期列。我一直在文档中搜索相关格式,但没有找到正确的格式。
我发现 $E8601DZ.
($E8601DZ. format) which results for example in: 2020-01-01T00:00:00+00.00
(notice the .000
missing after the seconds) and $E8601DTw.d
($E8601DTw.d format) 结果例如:2020-01-01T00:00:00.000
(注意缺少 +00:00
)。
因此,是否可以“混合”这两种格式以生成自定义格式,从而创建具有所需格式的日期变量?
SAS Code
:
data example;
date="2020-01-01T00:00:00.000+00:00";
run;
你声明你有一个包含日期时间表示值的字符变量。
您 link 到 的格式不是字符格式 ,因此 不会 以 $
。根据文档格式
Writes datetime values for the zero meridian
日期时间值基本上是数字。
您可能想要执行 input
以将字符值转换为实际的 SAS 日期时间值(从纪元开始的数字秒数 01jan1960T0:0:0
),然后将 ISO 日期时间格式应用于该变量正在接收日期时间值。
示例:
data have;
my_datetime_string = '2020-01-01T00:00:00';
run;
data want;
set have;
my_sas_datetime = input (my_datetime_string, E8601DT.);
my_sas_datepart = datepart(my_sas_datetime);
format my_sas_datetime datetime19.;
format my_sas_datepart date9.;
run;
proc print data=want;
run;
只需使用正确的信息格式读取数据和使用正确的格式写入数据。如果偏移量始终为零,请使用 E8601DZ format/informat。要包含三位小数,只需确保指定这是您想要的。生成的字符串总宽度为29个字符,其中小数点右边3个字符,所以使用e8601dz29.3
格式规范。您不想在 INFORMAT 中包含小数位宽度,因为信息格式中小数位的含义与格式不同,因此使用 e8601dz29.
作为信息格式规范。
data example;
string="2020-01-01T00:00:00.000+00:00";
datetime=input(string,e8601dz29.);
format datetime datetime19.;
string2=put(datetime,e8601dz29.3);
put (_all_) (=/);
run;
结果:
string=2020-01-01T00:00:00.000+00:00
datetime=01JAN2020:00:00:00
string2=2020-01-01T00:00:00.000+00:00
我在 SAS table 中有一个字符变量,它填充了非常规类型的日期时间。实际上,它具有以下格式:YYYY-MM-DDT00:00:00.000+00:00
。这是一个例子:2020-01-01T00:00:00
.
我想将此字符列转换为日期列。我一直在文档中搜索相关格式,但没有找到正确的格式。
我发现 $E8601DZ.
($E8601DZ. format) which results for example in: 2020-01-01T00:00:00+00.00
(notice the .000
missing after the seconds) and $E8601DTw.d
($E8601DTw.d format) 结果例如:2020-01-01T00:00:00.000
(注意缺少 +00:00
)。
因此,是否可以“混合”这两种格式以生成自定义格式,从而创建具有所需格式的日期变量?
SAS Code
:
data example;
date="2020-01-01T00:00:00.000+00:00";
run;
你声明你有一个包含日期时间表示值的字符变量。
您 link 到 的格式不是字符格式 ,因此 不会 以 $
。根据文档格式
Writes datetime values for the zero meridian
日期时间值基本上是数字。
您可能想要执行 input
以将字符值转换为实际的 SAS 日期时间值(从纪元开始的数字秒数 01jan1960T0:0:0
),然后将 ISO 日期时间格式应用于该变量正在接收日期时间值。
示例:
data have;
my_datetime_string = '2020-01-01T00:00:00';
run;
data want;
set have;
my_sas_datetime = input (my_datetime_string, E8601DT.);
my_sas_datepart = datepart(my_sas_datetime);
format my_sas_datetime datetime19.;
format my_sas_datepart date9.;
run;
proc print data=want;
run;
只需使用正确的信息格式读取数据和使用正确的格式写入数据。如果偏移量始终为零,请使用 E8601DZ format/informat。要包含三位小数,只需确保指定这是您想要的。生成的字符串总宽度为29个字符,其中小数点右边3个字符,所以使用e8601dz29.3
格式规范。您不想在 INFORMAT 中包含小数位宽度,因为信息格式中小数位的含义与格式不同,因此使用 e8601dz29.
作为信息格式规范。
data example;
string="2020-01-01T00:00:00.000+00:00";
datetime=input(string,e8601dz29.);
format datetime datetime19.;
string2=put(datetime,e8601dz29.3);
put (_all_) (=/);
run;
结果:
string=2020-01-01T00:00:00.000+00:00
datetime=01JAN2020:00:00:00
string2=2020-01-01T00:00:00.000+00:00