7、SAS数据格式与ISO 8601标准的全面解析

SAS数据格式与ISO 8601标准的全面解析

1. 压缩十进制和分区十进制格式及信息格式概述

在处理数据时,压缩十进制和分区十进制格式及信息格式是重要的概念。不同的编程环境有不同的对应格式。例如,在IBM VS COBOL II中:
| IBM VS COBOL II子句 | 对应的S370Fxxx格式/信息格式 |
| ---- | ---- |
| PIC S9(X) PACKED - DECIMAL | S370FPDw. |
| PIC 9(X) PACKED - DECIMAL | S370FPDUw. |
| PIC S9(W) DISPLAY | S370FZDw. |
| PIC 9(W) DISPLAY | S370FZDUw. |
| PIC S9(W) DISPLAY SIGN LEADING | S370FZDLw. |
| PIC S9(W) DISPLAY SIGN LEADING SEPARATE | S370FZDSw. |
| PIC S9(W) DISPLAY SIGN TRAILING SEPARATE | S370FZDTw. |

对于上述压缩十进制表示,X表示所表示的数字位数,W表示字节数。如PIC S9(X) PACKED - DECIMAL,W = ceil((x + 1) / 2);PIC 9(X) PACKED - DECIMAL,W = ceil(x / 2)。例如,PIC S9(5) PACKED - DECIMAL表示五位数字,若包含符号,需要六个半字节,ceil((5 + 1) / 2)长度为三个字节,W值为3。同时,COMP - 3可替代PACKED - DECIMAL。

在IBM汇编语言中,P指令表示压缩十进制,Z指令表示分区十进制。以下是汇编语言列表的摘录:
| 偏移量 | 十六进制值 | 指令标签 | 指令 |
| ---- | ---- | ---- | ---- |
| +000000 | 00001C | 2 PEX1 | DC PL3’1’ |
| +000003 | 00001D | 3 PEX2 | DC PL3’ - 1’ |
| +000006 | F0F0C1 | 4 ZEX1 | DC ZL3’1’ |
| +000009 | F0F0D1 | 5 ZEX2 | DC ZL3’1’ |

在PL/I中,FIXED DECIMAL属性与压缩十进制数据结合使用,而表示分区十进制数据必须使用PICTURE规范。FORTRAN和C语言则没有标准化的十进制数据表示。

SAS使用一组格式和信息格式来处理压缩和分区十进制数据,如下表所示:
| 格式 | 数据表示类型 | 对应的信息格式 | 注释 |
| ---- | ---- | ---- | ---- |
| PD | 压缩十进制 | PD | 本地带符号压缩十进制 |
| PK | 压缩十进制 | PK | 无符号压缩十进制;不特定于您的操作环境 |
| ZD | 分区十进制 | ZD | 本地分区十进制 |
| none | 分区十进制 | ZDB | 将EBCDIC空白(十六进制40)转换为EBCDIC零(十六进制F0);对应分区十进制信息格式 |
| none | 分区十进制 | ZDV | 非IBM分区十进制表示 |
| S370FPD | 压缩十进制 | S370FPD | 最后半字节为C(正)或D(负) |
| S370FPDU | 压缩十进制 | S370FPDU | 最后半字节始终为F(正) |
| S370FZD | 分区十进制 | S370FZD | 最后一个字节的高半字节包含符号:C(正)或D(负) |
| S370FZDU | 分区十进制 | S370FZDU | 无符号;符号半字节始终为F |
| S370FZDL | 分区十进制 | S370FZDL | 信息格式中第一个字节有符号半字节;格式中有单独的前导符号字节,十六进制C0(正)或D0(负) |
| S370FZDS | 分区十进制 | S370FZDS | 前导符号为 - (十六进制60)或 + (十六进制4E) |
| S370FZDT | 分区十进制 | S370FZDT | 尾随符号为 - (十六进制60)或 + (十六进制4E) |
| PDJULI | 压缩十进制 | PDJULI | 压缩表示的儒略日期 - IBM计算 |
| PDJULG | 压缩十进制 | PDJULG | 压缩表示的儒略日期 - 公历计算 |
| none | 压缩十进制 | RMFDUR | 输入布局为:mmsstttF |
| none | 压缩十进制 | SHRSTAMP | 输入布局为:yyyydddFhhmmssth,其中yyyydddF是压缩儒略日期;yyyy是从1900年开始的以0为基的年份 |
| none | 压缩十进制 | SMFSTAMP | 输入布局为:xxxxxxxxyyyydddF,其中yyyydddF是压缩儒略日期;yyyy是从1900年开始的以0为基的年份 |
| none | 压缩十进制 | PDTIME | 输入布局为:0hhmmssF |
| none | 压缩十进制 | RMFSTAMP | 输入布局为:0hhmmssFyyyydddF,其中yyyydddF是压缩儒略日期;yyyy是从1900年开始的以0为基的年份 |

2. 使用ISO 8601基本和扩展表示法处理日期和时间

ISO 8601标准为日期、时间、日期时间、持续时间和间隔值的表示提供了统一的符号和规则。以下是ISO 8601格式化符号的解释:
- n :指定表示年、月或日数量的数字。
- P :表示后续的持续时间由年、月、日、小时、分钟和秒的数量指定。
- T :表示后续是时间值。任何包含时间的值必须以T开头。需要注意的是,以E8601开头的扩展表示法信息格式读取的时间值必须使用大写T。
- W :表示持续时间以周为单位指定。
- Z :表示时间值是英国格林威治时间或UTC时间。
- +|- :+ 表示相对于英国格林威治以东的时区偏移, - 表示以西的时区偏移。
- yyyy :指定四位数年份。
- mm :作为日期的一部分,指定两位数月份,范围为01 - 12。
- dd :指定两位数日期,范围为01 - 31。
- hh :指定两位数小时,范围为00 - 24。
- mm :作为时间的一部分,指定两位数分钟,范围为00 - 59。
- ss :指定两位数秒,范围为00 - 59。
- fff | ffffff :指定可选的秒的小数部分,使用数字0 - 9。fff用于$N8601B信息格式和$N8601E信息格式读取的值,使用1 - 3位数字;ffffff用于除$N8601B信息格式和$N8601E信息格式之外的信息格式,使用1 - 6位数字。
- Y :在持续时间中,表示此字符之前是年值。
- M :作为日期的一部分,在持续时间中表示此字符之前是月值;作为时间的一部分,表示此字符之前是分钟值。
- D :在持续时间中,表示此字符之前是日值。
- H :在持续时间中,表示此字符之前是小时值。
- S :在持续时间中,表示此字符之前是秒值。

SAS使用以下格式将SAS日期、时间和日期时间值以ISO 8601基本和扩展表示法写入日期、时间和日期时间值:
| 日期、时间或日期时间 | ISO 8601表示法 | 示例 | 格式 |
| ---- | ---- | ---- | ---- |
| 基本表示法 | | | |
| 日期 | yyyymmdd | 20080915 | B8601DAw. |
| 时间 | hhmmssffffff | 155300322348 | B8601TMw.d |
| 带时区的时间 | hhmmss+|-hhmm
hhmmssZ | 155300+0500
155300Z | B8601TZw.d |
| 转换为带时区的本地时间 | hhmmss+|-hhmm | 155300+0500 | B8601LZw.d |
| 日期时间 | yyyymmddThhmmssffffff | 20080915T155300 | B8601DTw.d |
| 带时区的日期时间 | yyyymmddThhmmss+|-hhmm
yyyymmddThhmmssZ | 20080915T155300+0500
20080915T155300Z | B8601DZw.d |
| 从日期时间中写入日期 | yyyymmdd | 20080915 | B8601DNw. |
| 扩展表示法 | | | |
| 日期 | yyyy - mm - dd | 2008 - 09 - 15 | E8601DAw. |
| 时间 | hh:mm:ss.ffffff | 15:53:00.322348 | E8601TMw.d |
| 带时区的时间 | hh:mm:ss.ffffff+|-hh:mm | 15:53:00+05:00 | E8601TZw.d |
| 转换为带时区的本地时间 | hh:mm:ss.ffffff+|-hh:mm | 15:53:00+05:00 | E8601LZw.d |
| 日期时间 | yyyy - mm - ddThh:mm:ss.ffffff | 2008 - 09 - 15T15:53:00 | E8601TZw.d |
| 带时区的日期时间 | yyyy - mm - ddThh:mm:ss.nnnnnn+|-hh:mm | 2008 - 09 - 15T15:53:00+05:00 | E8601DZw.d |
| 从日期时间中写入日期 | yyyy - mm - dd | 2008 - 09 - 15 | E8601DNw. |

如果日期或时间格式化值超出范围,则使用星号(*)代替。

3. 写入ISO 8601持续时间、日期时间和间隔值

SAS使用特定格式从字符数据写入持续时间、日期时间和间隔值。
- 持续时间格式
- 基本表示法 :PyyyymmddThhmmssfff,例如P20080915T155300,格式为$N8601BA; - PyyyymmddThhmmssfff,例如 - P20080915T155300,格式也为$N8601BA。
- 扩展表示法 :Pyyyy - mm - ddThh:mm:ss.fff,例如P2008 - 09 - 15T15:53:00,格式为$N8601EA; - Pyyyy - mm - ddThh:mm:ss.fff,例如 - P2008 - 09 - 15T15:53:00,格式为$N8601EA。
- 基本和扩展表示法通用 :PnYnMnDTnHnMnS,例如P2y10m14dT20h13m45s,格式为$N8601B和$N8601E; - PnYnMnDTnHnMnS,例如 - P2y10m14dT20h13m45s,格式为$N8601B和$N8601E;PnW(周),例如P6w,格式为$N8601B和$N8601E。
- 间隔格式
- 基本表示法 :yyyymmddThhmmssfff/yyyymmddThhmmssfff,例如20080915T155300/20101113T000000,格式为$N8601BA;PnYnMnDTnHnMnS/yyyymmddThhmmssfff,例如P2y10M14dT20h13m45s/20080915T155300,格式为$N8601B;yyyymmddThhmmssfff/PnYnMnDTnHnMnS,例如20080915T155300/P2y10M14dT20h13m45s,格式为$N8601BA。
- 扩展表示法 :yyyy - mm - ddThh:mm:ss.fff/yyyy - mm - ddThh:mm:ss.fff,例如2008 - 09 - 15T15:53:00/2010 - 11 - 13T00:00:00,格式为$N8601EA;PnYnMnDTnHnMnS/yyyy - mm - ddThh:mm:ss.fff,例如P2y10M14dT20h13m45s/2008 - 09 - 15T15:53:00,格式为$N8601E;yyyy - mm - ddThh:mm:ss.fff/PnYnMnDTnHnMnS,例如2008 - 09 - 15T15:53:00/P2y10M14dT20h13m45s,格式为$N8601EA。
- 日期时间格式
- 基本表示法 :yyyymmddThhmmss.fff+|-hhmm,例如20080915T155300,格式为$N8601BA;全空白时,格式为$N8601B、$N8601BA、$N8601E、$N8601EA。
- 扩展表示法 :yyyy - mm - ddThh:mm:ss.fff+|-hhmm,例如2008 - 09 - 15T15:53:00 + 04:30,格式为$N8601EA;全空白时,格式为$N8601B、$N8601BA、$N8601E、$N8601EA。

在扩展日期时间形式yyyy - mm - ddThh:mm:ss和扩展持续时间形式Pyyyy - mm - ddThh:mm:ss中,省略的组件可以用连字符( - )或x表示。而在持续时间形式PnYnMnDTnHnMnS中,省略的组件会被丢弃,不包含连字符或x。以下是写入省略组件的格式:
| 格式 | 日期时间形式 | 持续时间形式 | 示例 |
| ---- | ---- | ---- | ---- |
| $N8601H | yyyy - mm - ddThh:mm:ss | PnYnMnDTnHnMnS | –09 - 15T15: - :53
P2Y2DT4H5M6S/–09 - 15T15: - :00 |
| $N8601EH | yyyy - mm - ddThh:mm:ss | Pyyyy - mm - ddThh:mm:ss | P000—02T02:55:20/2008—15T - : - :45 |
| $N8601X | yyyy - mm - ddThh:mm:ss | PnYnMnDTnHnMnS | P2Y2DT4H5M6S/x - 09 - 15T15:x:00 |
| $N8601EX | yyyy - mm - ddThh:mm:ss | Pyyyy - mm - ddThh:mm:ss | P0003 - x - 02T02:55:20/2008 - x - 15Tx:x:45 |

如果使用$N8601B格式或$N8601BA格式格式化包含省略组件的日期时间值,会使用连字符表示省略组件的扩展表示法以确保数据准确。如果使用$N8601BA格式格式化持续时间,也会使用带连字符的扩展表示法代替基本表示法。

4. 写入截断的持续时间、日期时间和间隔值

当持续时间、日期时间或间隔值的一个或多个低阶值为0或不重要时,可以进行截断。当SAS使用$N8601B、$N8601BA、$N8601E和$N8601EA格式写入截断值时,显示会在最后一个非缺失组件处停止。当使用$N8601H格式或$N8601EH格式格式化截断值时,低阶组件会用连字符写入;使用$N8601X格式或$N8601EX格式时,低阶组件会用x写入。以下是截断值的示例:
- p00030202T1031
- 2008 - 09 - 15T15/2010 - 09 - 15T15:53
- - p0003 - 03 - 03T - : - : -
- P2y3m4dT5h6m
- 2008 - 09 - xTx:x:x
- 2008

5. 持续时间组件的规范化

当持续时间组件的值大于该组件的最大标准值时,SAS会对组件进行规范化处理,但持续时间组件为单个组件时除外。以下是规范化持续时间组件的示例:
| 持续时间 | 扩展规范化持续时间 |
| ---- | ---- |
| p3y13m | p0004 - 01 |
| pt24h24m65s | P----01T - :25:05 |
| p3y13mT24h61m | P0004 - 01 - 01T01:01 |
| p0004 - 13 | p0005 - 01 |
| p0003 - 02 - 61T15:61:61 | P0003 - 04 - 01T16:02:01 |
| p13m | P13M |

如果组件包含最大值,如分钟或秒为60,SAS会对值进行规范化处理,并用连字符替换该值。例如,pT12:60:13变为PT13: - :13。一个月按30天进行规范化。日期时间值中的日期和时间大于组件的标准值时不会进行规范化,会产生错误。

6. 持续时间、日期时间和间隔值中的分数

结束组件可以包含一个由句点或逗号后跟一到三位数字组成的分数。以下是在持续时间、日期时间和间隔值中使用分数的示例:
- 200809.5
- P2008 - 09 - 15T10.33
- 2008 - 09 - 15/P0003 - 03 - 03,333

7. 按类别划分的格式

SAS的格式可以分为四个类别:
| 类别 | 描述 |
| ---- | ---- |
| 字符 | 指示SAS从字符变量写入字符数据值。 |
| 日期和时间 | 指示SAS从表示日期、时间和日期时间的变量写入数据值。 |
| ISO 8601 | 指示SAS使用ISO 8601标准写入日期、时间和日期时间值。 |
| 数值 | 指示SAS从数值变量写入数值数据值。 |

以下是各类型格式的部分示例:
- 字符格式
- $ASCIIw.格式 :将原生格式字符数据转换为ASCII表示。
- $BASE64Xw.格式 :使用Base 64编码将字符数据转换为ASCII文本。
- $BINARYw.格式 :将字符数据转换为二进制表示。
- 日期和时间格式
- $N8601Bw.d格式 :使用基本表示法PnYnMnDTnH nMnS和yyyymmddThhmmss写入ISO 8601持续时间、日期时间和间隔形式。
- DATEw.格式 :以ddmmmyy、ddmmmyyyy或dd - mmm - yyyy的形式写入日期值。
- DATETIMEw.d格式 :以ddmmmyy:hh:mm:ss.ss的形式写入日期时间值。
- ISO 8601格式
- B8601DAw.格式 :使用IOS 8601基本表示法yyyymmdd写入日期值。
- E8601DTw.d格式 :使用ISO 8601扩展表示法yyyy - mm - ddThh:mm:ss.ffffff写入日期时间值。
- 数值格式
- BESTw.格式 :SAS选择最佳表示法。
- COMMAw.d格式 :写入数值时,每三位数字用逗号分隔,小数部分用句点分隔。
- DOLLARw.d格式 :写入数值时,前面带美元符号,每三位数字用逗号分隔,小数部分用句点分隔。

通过对这些格式和标准的深入理解和应用,可以更高效地处理和展示各种类型的数据。

SAS数据格式与ISO 8601标准的全面解析

8. 各类型格式详细介绍
8.1 字符格式

字符格式主要用于处理字符变量的数据值。除了上半部分提到的,还有以下常见格式:
| 格式 | 描述 |
| ---- | ---- |
| $CHARw.格式 | 写入标准字符数据。 |
| $EBCDICw.格式 | 将原生格式字符数据转换为EBCDIC表示。 |
| $HEXw.格式 | 将字符数据转换为十六进制表示。 |
| $MSGCASEw.格式 | 当MSGCASE系统选项生效时,以大写形式写入字符数据。 |
| $OCTALw.格式 | 将字符数据转换为八进制表示。 |
| $QUOTEw.格式 | 写入用双引号括起来的数据值。 |
| $REVERJw.格式 | 按相反顺序写入字符数据并保留空格。 |
| $REVERSw.格式 | 按相反顺序写入字符数据并左对齐。 |
| $UPCASEw.格式 | 将字符数据转换为大写。 |
| $VARYINGw.格式 | 写入可变长度的字符数据。 |
| $w.格式 | 写入标准字符数据。 |

这些格式在处理不同编码和表示需求的字符数据时非常有用。例如,当需要将数据在不同编码系统之间转换时,$ASCIIw.格式和$EBCDICw.格式就可以发挥作用;而$HEXw.格式和$OCTALw.格式则有助于对数据进行底层的分析和调试。

8.2 日期和时间格式

日期和时间格式涵盖了多种表示方式,以满足不同的业务需求。以下是更多详细介绍:
| 格式 | 描述 |
| ---- | ---- |
| $N8601BAw.d格式 | 使用基本表示法PyyyymmddThhmmss和yyyymmdd Thhmmss写入ISO 8601持续时间、日期时间和间隔形式。 |
| $N8601Ew.d格式 | 使用扩展表示法PnYnMnDTn HnMnS和yyyy - mm - ddT hh:mm:ss写入ISO 8601持续时间、日期时间和间隔形式。 |
| $N8601EAw.d格式 | 使用扩展表示法Pyyyy - mm - ddThh:mm:ss和yyyy - mm - ddThh:mm:ss写入ISO 8601持续时间、日期时间和间隔形式。 |
| $N8601EHw.d格式 | 使用扩展表示法Pyyyy - mm - ddThh:mm:ss和yyyy - mm - ddThh:mm:ss,用连字符( - )表示省略组件。 |
| $N8601EXw.d格式 | 使用扩展表示法Pyyyy - mm - ddThh:mm:ss和yyyy - mm - ddThh:mm:ss,用x表示省略组件的数字。 |
| $N8601Hw.d格式 | 写入ISO 8601持续时间、日期时间和间隔形式P nYnMnDTnHnM nS和yyyy - mm - ddThh:mm:ss,丢弃持续时间值中省略的组件,用连字符( - )表示日期时间值中省略的组件。 |
| $N8601Xw.d格式 | 写入ISO 8601持续时间、日期时间和间隔形式P nYnMnDTnHnM nS和yyyy - mm - ddThh:mm:ss,丢弃持续时间值中省略的组件,用x表示日期时间值中省略组件的每个数字。 |
| B8601DNw.格式 | 使用ISO 8601基本表示法yyyymmdd从日期时间值中写入日期。 |
| B8601DTw.d格式 | 使用ISO 8601基本表示法yyyymmdd Thhmmssffffff写入日期时间值。 |
| B8601DZw.格式 | 使用ISO 8601日期时间和时区基本表示法yyyymmdd Thhmmss+|-hhmm在协调世界时(UTC)时间尺度上写入日期时间值。 |
| B8601LZw.格式 | 通过附加本地时间与UTC之间的时区偏移差,使用ISO 8601基本时间表示法hhmmss+|-hhmm将时间值写为本地时间。 |
| B8601TMw.d格式 | 使用ISO 8601基本表示法hhmmssffff写入时间值。 |
| B8601TZw.格式 | 将时间值调整为协调世界时(UTC),并使用ISO 8601基本时间表示法hhmmss+|- hhmm写入。 |
| DATEAMPMw.d格式 | 以ddmmmyy:hh:mm:ss.ss并带有AM或PM的形式写入日期时间值。 |
| DAYw.格式 | 将日期值写为月份中的某一天。 |
| DDMMYYw.格式 | 以ddmm yy或dd/mm/ yy的形式写入日期值,其中斜杠为分隔符,年份可以是2位或4位。 |
| DDMMYYxw.格式 | 以ddmm yy或dd - mm - yy 的形式写入日期值,其中格式名称中的x是一个字符,表示分隔日、月、年的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位。 |
| DOWNAMEw.格式 | 将日期值写为星期几的名称。 |
| DTDATEw.格式 | 期望输入日期时间值,并以ddmmmyy或ddmmmyyyy的形式写入日期值。 |
| DTMONYYw.格式 | 将日期时间值的日期部分写为月份和年份,形式为mmm yy或mmm yyyy。 |
| DTWKDATXw.格式 | 将日期时间值的日期部分写为星期几和日期,形式为day - of - week, dd month - name yy(或yyyy)。 |
| DTYEARw.格式 | 将日期时间值的日期部分写为年份,形式为yy或yyyy。 |
| DTYYQCw.格式 | 将日期时间值的日期部分写为年份和季度,用冒号(:)分隔。 |
| E8601DNw.格式 | 使用ISO 8601扩展表示法yyyy - mm - dd从SAS日期时间值中写入日期。 |
| E8601DTw.d格式 | 使用ISO 8601扩展表示法yyyy - mm - ddThh:mm:ss.ffffff写入日期时间值。 |
| E8601DZw.格式 | 使用ISO 8601日期时间和时区扩展表示法yyyy - mm - ddThh:mm:ss+|-hh:mm在协调世界时(UTC)时间尺度上写入日期时间值。 |
| E8601LZw.格式 | 将时间值写为本地时间,附加本地SAS会话的协调世界时(UTC)偏移量,使用ISO 8601扩展时间表示法hh:mm:ss+|-hh:mm。 |
| E8601TMw.d格式 | 使用ISO 8601扩展表示法hh:mm:ss.ffffff写入时间值。 |
| E8601TZw.d格式 | 将时间值调整为协调世界时(UTC),并使用ISO 8601扩展表示法hh:mm :ss+|-hh:mm写入。 |
| HHMMw.格式 | 以hh:mm的形式将时间值写为小时和分钟。 |
| HOURw.格式 | 将时间值写为小时和小时的小数部分。 |
| JULDAYw.格式 | 将日期值写为一年中的儒略日。 |
| JULIANw.格式 | 将日期值写为儒略日期,形式为yyddd或yyyyddd。 |
| MMDDYYw.格式 | 以mmdd yy或mm/dd/ yy的形式写入日期值,其中斜杠为分隔符,年份可以是2位或4位。 |
| MMDDYYxw.格式 | 以mmdd yy或mm - dd - yy的形式写入日期值,其中格式名称中的x是一个字符,表示分隔月、日、年的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位。 |
| MMSSw.格式 | 将时间值写为自午夜以来的分钟和秒数。 |
| MMYYw.格式 | 以mmM yy的形式写入日期值,其中M是分隔符,年份可以是2位或4位。 |
| MMYYxw.格式 | 以mm yy或mm - yy的形式写入日期值,其中格式名称中的x是一个字符,表示分隔月和年的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位。 |
| MONNAMEw.格式 | 将日期值写为月份的名称。 |
| MONTHw.格式 | 将日期值写为一年中的月份。 |
| MONYYw.格式 | 将日期值写为月份和年份,形式为mmm yy或mmm yyyy。 |
| PDJULGw.格式 | 以十六进制格式yyyydddF为IBM写入压缩儒略日期值。 |
| PDJULIw.格式 | 以十六进制格式ccyydddF为IBM写入压缩儒略日期值。 |
| QTRw.格式 | 将日期值写为一年中的季度。 |
| QTRRw.格式 | 将日期值写为一年中的季度,用罗马数字表示。 |
| TIMEw.d格式 | 以hh:mm:ss.ss的形式将时间值写为小时、分钟和秒。 |
| TIMEAMPMw.d格式 | 以hh:mm:ss.ss并带有AM或PM的形式将时间值写为小时、分钟和秒。 |
| TODw.d格式 | 以hh:mm:ss.ss的形式写入SAS时间值和SAS日期时间值的时间部分。 |
| WEEKDATEw.格式 | 将日期值写为星期几和日期,形式为day - of - week, month - name dd, yy(或yyyy)。 |
| WEEKDATXw.格式 | 将日期值写为星期几和日期,形式为day - of - week, dd month - name yy(或yyyy)。 |
| WEEKDAYw.格式 | 将日期值写为星期几。 |
| WEEKUw.格式 | 使用U算法以十进制格式写入周数。 |
| WEEKVw.格式 | 使用V算法以十进制格式写入周数。 |
| WEEKWw.格式 | 使用W算法以十进制格式写入周数。 |
| WORDDATEw.格式 | 将日期值写为月份名称、日期和年份,形式为month - name dd, yyyy。 |
| WORDDATXw.格式 | 将日期值写为日期、月份名称和年份,形式为dd month - name yyyy。 |
| YEARw.格式 | 将日期值写为年份。 |
| YYMMw.格式 | 以 yyM mm的形式写入日期值,其中M是一个字符分隔符,表示月份数字跟随M之后,年份可以是2位或4位。 |
| YYMMxw.格式 | 以 yymm或 yy - mm的形式写入日期值,其中格式名称中的x是一个字符,表示分隔年和月的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位。 |
| YYMMDDw.格式 | 以yymmdd或 yy - mm - dd的形式写入日期值,其中破折号为分隔符,年份可以是2位或4位。 |
| YYMMDDxw.格式 | 以yymmdd或 yy - mm - dd的形式写入日期值,其中格式名称中的x是一个字符,表示分隔年、月、日的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位。 |
| YYMONw.格式 | 以yymmm或yyyymmm的形式写入日期值。 |
| YYQw.格式 | 以 yyQ q的形式写入日期值,其中Q是分隔符,年份可以是2位或4位,q是一年中的季度。 |
| YYQxw.格式 | 以 yyq或 yy - q的形式写入日期值,其中格式名称中的x是一个字符,表示分隔年和季度或年的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位。 |
| YYQRw.格式 | 以 yyQ qr的形式写入日期值,其中Q是分隔符,年份可以是2位或4位,qr是用罗马数字表示的一年中的季度。 |
| YYQRxw.格式 | 以 yy qr或 yy - qr的形式写入日期值,其中格式名称中的x是一个字符,表示分隔年和季度或年的特殊字符,可以是连字符( - )、句点(.)、空格、斜杠(/)、冒号(:)或无分隔符;年份可以是2位或4位,qr是用罗马数字表示的一年中的季度。 |

这些格式可以帮助用户根据不同的业务场景和数据展示需求,灵活地处理和呈现日期和时间数据。例如,在需要与国际标准接轨的场景中,ISO 8601相关的格式就非常有用;而在一些传统的业务报表中,像DATEw.格式、DATETIMEw.格式等则更为常见。

8.3 ISO 8601格式

ISO 8601格式主要用于遵循ISO 8601标准来处理日期、时间和日期时间数据。其格式与日期和时间格式有部分重叠,但更强调标准的规范性。以下是一个简单的流程说明,展示如何使用ISO 8601格式处理数据:

graph LR
    A[获取数据] --> B[选择合适的ISO 8601格式]
    B --> C{数据类型}
    C -->|日期| D[使用日期相关格式,如B8601DAw.或E8601DAw.]
    C -->|时间| E[使用时间相关格式,如B8601TMw.d或E8601TMw.d]
    C -->|日期时间| F[使用日期时间相关格式,如B8601DTw.d或E8601DTw.d]
    D --> G[格式化数据]
    E --> G
    F --> G
    G --> H[输出格式化后的数据]

这个流程图展示了使用ISO 8601格式处理数据的基本步骤:首先获取数据,然后根据数据类型选择合适的格式,接着进行数据格式化,最后输出格式化后的数据。

8.4 数值格式

数值格式用于处理数值变量的数据值,提供了多种表示方式。以下是更多数值格式的介绍:
| 格式 | 描述 |
| ---- | ---- |
| BESTDw.p格式 | 打印数值,使相似量级的值的小数点对齐,并打印无小数的整数。 |
| BINARYw.格式 | 将数值转换为二进制表示。 |
| COMMAXw.d格式 | 写入数值时,每三位数字用句点分隔,小数部分用逗号分隔。 |
| Dw.p格式 | 打印数值,可能有较大范围的值,使相似量级的值的小数点对齐。 |
| DOLLARXw.d格式 | 写入数值时,前面带美元符号,每三位数字用句点分隔,小数部分用逗号分隔。 |
| Ew.格式 | 以科学记数法写入数值。 |
| FLOATw.d格式 | 通过将数字乘以10的d次幂生成原生单精度浮点值。 |
| FRACTw.格式 | 将数值转换为分数。 |
| HEXw.格式 | 将实二进制(浮点)值转换为十六进制表示。 |
| IBw.d格式 | 写入原生整数二进制(定点)值,包括负值。 |
| IBRw.d格式 | 以Intel和DEC格式写入整数二进制(定点)值。 |
| IEEEw.d格式 | 通过将数字乘以10的d次幂生成IEEE浮点值。 |
| NEGPARENw.d格式 | 将负数值用括号括起来写入。 |
| NUMXw.d格式 | 用逗号代替小数点写入数值。 |
| OCTALw.格式 | 将数值转换为八进制表示。 |
| PDw.d格式 | 以压缩十进制格式写入数据。 |
| PERCENTw.d格式 | 将数值写为百分比。 |
| PERCENTNw.d格式 | 生成百分比,负值用负号表示。 |
| PIBw.d格式 | 写入正整数二进制(定点)值。 |
| PIBRw.d格式 | 以Intel和DEC格式写入正整数二进制(定点)值。 |
| PKw.d格式 | 以无符号压缩十进制格式写入数据。 |
| PVALUEw.d格式 | 写入p值。 |
| RBw.d格式 | 以实二进制格式写入实二进制数据(浮点)。 |
| ROMANw.格式 | 将数值写为罗马数字。 |
| S370FFw.d格式 | 以IBM大型机格式写入原生标准数值数据。 |
| S370FIBw.d格式 | 以IBM大型机格式写入整数二进制(定点)值,包括负值。 |
| S370FIBUw.d格式 | 以IBM大型机格式写入无符号整数二进制(定点)值。 |
| S370FPDw.d格式 | 以IBM大型机格式写入压缩十进制数据。 |
| S370FPDUw.d格式 | 以IBM大型机格式写入无符号压缩十进制数据。 |
| S370FPIBw.d格式 | 以IBM大型机格式写入正整数二进制(定点)值。 |
| S370FRBw.d格式 | 以IBM大型机格式写入实二进制(浮点)数据。 |
| S370FZDw.d格式 | 以IBM大型机格式写入分区十进制数据。 |
| S370FZDLw.d格式 | 以IBM大型机格式写入分区十进制前导符号数据。 |
| S370FZDSw.d格式 | 以IBM大型机格式写入分区十进制单独前导符号数据。 |
| S370FZDTw.d格式 | 以IBM大型机格式写入分区十进制单独尾随符号数据。 |
| S370FZDUw.d格式 | 以IBM大型机格式写入无符号分区十进制数据。 |

这些数值格式可以满足不同的数值处理和展示需求。例如,在财务报表中,DOLLARw.d格式和DOLLARXw.d格式可以方便地表示货币金额;而在科学计算中,Ew.格式和IEEEw.d格式则更适合处理科学记数法和浮点数值。

9. 总结

通过对SAS数据格式和ISO 8601标准的全面解析,我们了解到SAS提供了丰富的格式来处理各种类型的数据,包括字符、日期和时间、数值等。ISO 8601标准为日期、时间和日期时间的表示提供了统一的规范,使得数据在不同系统和应用之间的交换更加方便和准确。

在实际应用中,我们可以根据具体的业务需求选择合适的格式。例如,在处理国际业务时,优先使用ISO 8601相关的格式;在处理本地业务时,可以根据习惯选择传统的日期和时间格式。同时,对于数值数据,要根据数据的性质和展示要求选择合适的数值格式。

掌握这些格式和标准,有助于我们更高效地处理和展示数据,提高数据处理的准确性和可读性,从而更好地支持业务决策和数据分析工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值