Date 如何定义给定日期的日期格式

Date 如何定义给定日期的日期格式,date,datetime,sas,formatting,Date,Datetime,Sas,Formatting,我想知道,我们如何从给定的日期定义日期格式 例如,我有日期20180423,然后在sas中我想将格式定义为“yyyymmdd” 同样,数据中给出的日期为12022018,然后我想定义为“ddmmyyyy” 请注意,日期是以正确的日期提供给我的,但我现在想定义格式。 给出的日期将来可能会有所不同 所以我需要通过SAS处理所有的日期格式 我所认为的日期是20180422 使用substr函数 data test; a=20180422; a=substr(a,1,4); b=substr(a,5,1

我想知道,我们如何从给定的日期定义日期格式

例如,我有日期20180423,然后在sas中我想将格式定义为“yyyymmdd”

同样,数据中给出的日期为12022018,然后我想定义为“ddmmyyyy”

请注意,日期是以正确的日期提供给我的,但我现在想定义格式。 给出的日期将来可能会有所不同 所以我需要通过SAS处理所有的日期格式

我所认为的日期是20180422 使用substr函数

data test;
a=20180422;
a=substr(a,1,4);
b=substr(a,5,1);
c=substr(a,7,1);
run;
但不确定

如果有人能提供解决方案,那么它对我的项目工作真的很有帮助


提前感谢您的帮助。

听起来您想将各种值转换为日期。SAS以数字形式存储日期,即自1960年1月1日起的天数。然后通常会将此数字格式化为日期,以首选的格式显示

导入已采用格式的日期时,必须使用
输入
功能和信息,将格式值转换为SAS日期。如果读取的日期值都采用相同的格式,则可以使用特定的信息。在使用不同格式的情况下,您可以使用
anydte.
informat,它将大多数标准日期格式转换为SAS日期

下面的示例将3种不同的日期格式转换为SAS日期,然后以
date9.
格式显示SAS日期。我已将未格式化和格式化的新值打印到日志中,以便您可以看到它们存储为数字

data _null_;
input date_in $20.;
date_out = input(date_in, anydtdte20.);
put date_in date_out date_out :date9.;
datalines;
20180422
12022018
27apr2018
;
run;

可以在数据步骤中使用if条件。使用If条件,检查条件是否为true(检查日期值是否满足要求的条件),然后使用put函数格式化日期。put函数可以将源作为第一个参数,将格式作为第二个参数,并返回格式化后的值。同一列的不同值可以以这种方式指定不同的格式

像这样的,

  if a = 'date1CheckCondtion' then newA = put(a , dateformat1.);
  if a = 'date2' then newA = put(a , dateformat2.);
然后,您可以选择以通用格式获取所有值,如下所示:

  dateA=input(newA,mmddyy6.);
使用
输入(a,anydtdte20)
;这将把任何日期转换为SAS日期,然后使用函数
Year()
Month()
Day()
提取所需的数据。 您会发现这个SAS在日期和地区方面非常有用

解决方案:

我创建了一个有两行的表;每行都有不同的日期格式YYYYMMDD和DDMMYYYY,向您展示代码如何处理不同的日期格式,将它们保存到SAS date,并将它们分解为年、月和日:

options DATESTYLE=DMY;
data have;
input a;
datalines;
20180422
12022018
;
run;

data test;
set have;
format date_a date9.;
date_a=input(a,anydtdte20.);
Year_a=year(date_a);
month_a=month(date_a);
day_a=day(date_a);
run;
输出:

a=20180422 date_a=22APR2018 Year_a=2018 month_a=4 day_a=22 
a=12022018 date_a=12FEB2018 Year_a=2018 month_a=2 day_a=12

感谢您的回复,我想它会将所有日期格式化为date9。特定格式,表示20180422自动转换为yyyymmdd,12022018自动转换为ddmmyyyy。最后一个日期2018年4月27日转换为日期9,简而言之,从给定日期开始(我从.txt文件导入日期),例如.txt文件中存在列名为DT的20180424,那么现在我需要检查前4位也是年份,如果.txt文件中存在不同的日期,如20122018,这里的前2位是“dd”,“mm”和“yyyy”,所以从给定日期开始,我需要定义格式。所以这里的格式完全改变了,我仍然不确定我是否理解你。上述代码将把您所述的两个数字转换为有效的SAS日期。导入数据时,您不需要事先知道它们的格式。
anydte
informat将尝试将许多不同类型的字符串转换为日期值。请注意,默认为M-D-Y还是D-M-Y顺序的不明确字符串取决于区域设置。如果日期类似于
20180404
,会发生什么情况?您如何判断哪个是月,哪个是日期?将尝试使用此功能,谢谢您的帮助。在第二个日期中,12022018'应该是ddmmyyy,但在这里,月份显示12,实际上日期a应该显示12,对吗?如果您的日期区域设置为US,则将被读取为MMDDYY,如果区域设置为Europe,则将被读取为DDMMYY。我将在我的代码中添加一个选项语句来使用DMY语言环境。谢谢你们的帮助,假设我也有带有/和-(连字符)的日期格式。我的想法是将date_格式保存在ddmmyyyy、mmddyyyy、yyyyymmdd、dd/mm/yyyy、yyyy/mm/dd、mm/dd/yyyyy文件中,并且1个日期格式的时间戳为yyyy-mm-dd hh:mm:ss将以hh:mm:ss形式显示冒号,我现在已将上述日期_格式及其长度存储在1个表中,在.txt文件中,我给出了EX2018-06-23的日期,然后它会自动从表中提取yyyy-mm-dd,如果是20180406,则是yyyymmdd。请你帮我把这个换成一个新问题好吗。