使用 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