时间(Time),用物理语言来解释,它是物质的永恒运动、变化的持续性、顺序性的表现。古往今来,时间的计量方式也多种多样,公元纪年法、帝王纪年法、干支纪年法、民国纪年法等等,每种纪年方式都有各自定义的规则。同样地,在编程世界中也有这样的运行规则。
SAS采取的是以1960年1月1号为日期的原点,1960年1月1号0点0分0秒为时间的原点,但并不是说在此之前的日期就无法表示。在原点之前的日期依然用与原点的间隔来表示,只是前面需要加一个负号。例如-2如果表示日期,则表示的是1960年1月1日的前两天,即1959年12月30日。
1.日期变量的数据格式
日期变量的格式是将日期存储的数字转化为完全或部分包含年、月、日的值,其中比较常用的是yymmdd.格式和date.格式,使用方法是格式名+长度。
例如yymmdd.格式:
使用format语句对date变量赋予数据格式,让它的格式显示为yymmdd10.格式,查看数据集,我们得到的是2020-03-26,这正是与日期原点相差22000天的日期。
yymmddw.为一类数据格式的统称,它们都以年为开头,后接月和日,不同长度的显示样式不同,下表是不同长度的yymmdd格式的显示样式。
有时,我们不希望仅以数字表达日期,而是希望用月份名称来表示,SAS也提供了相关的数据格式,这就是date.格式,例如:
运行后查看结果,得到的是26MAR2020,可以看到date.格式按照日月年的顺序显示日期,但将月份以3位字母表示。这样做的好处是表示年与日的数字分离,中间以字母间隔,每部分内容表示的意义一目了然,方便查看。当然缺点在于直观上理解不便,例如相同年份的05月和06月,我们很容易看出谁在前面,但MAY和JUN则需要反应一下。
date.格式的长度可以在5~11之间取值,它们的区别如表所示。
2.时间变量的数据格式
提到时间的时候,我们一般有两种所指,一种是日期与时间的结合,它在SAS中用该日期时间点与1960年1月1日0点0分0秒相距的秒数表示。而另一种时间是指一个单纯的时间,例如05:00,它所对应的数字是其与0点0分0秒相距的秒数。我们首先来看这种单纯的时间。
时间最常用的格式为time.格式,它的显示清晰、明确,将时、分、秒,以:分割显示。例如:
生成的数据集中,time变量的值为3:25:45,表示与0点0分0秒相距12345秒的时间点为凌晨3点25分45秒。
3.IOS8601格式
ISO8601日期时间格式是一种“日期+时间”的数据格式。
符合ISO8601标准的日期和时间如下:
它是一个结合了日期与时间的函数,首先看日期,类似yymmdd10.格式,以4位年+2位月+2位日,中间以-分割的方式表达日期,时间则类似time8.格式,使用2位时+2位分+2位秒,中间以:分隔,日期与时间之间以字母T分隔。
ISO8601格式在SAS中的格式如下:
4.与日期和时间变量相关的函数
日期和时间变量虽然在SAS中并不是一类特别的变量,但是SAS设计了专门的函数来处理它们。大体可以分为3类:截取类、组合类和间隔类。
1)截取类
当我们获取了一个日期和时间变量后,有时候我们希望将其拆解为年月日时分秒,此时截取类函数就发挥了作用,具体如下所示的函数:
2)组合类
组合类函数与截取类函数功能相反,是将组成日期的部分直接组合成一个完整的日期变量,具体如下所示的函数:
3)间隔类
最后要介绍的是间隔类函数,最常用的为intck和intnx。
intck函数的功能是给定两个日期,计算它们中间的间隔数量,代码为:
例如我们有date1=2020-05-18,date2=2019-03-17,希望计算它们之间相差多少天,使用intck的方法为:
intnx函数的功能是给定某个日期和间隔的数量,获得另一个日期值,代码为:
例如我们已知今天的日期,希望得到7个礼拜之后的日期,可以使用以下语句:
SAS提供了大量专门的函数和数据格式,熟悉它们可以让我们更好地进行数据分析工作。希望读者读完可以有所收获。