将字符串日期转换为 SPSS 日期变量

作者:Ruben Geert van den Berg,发表于 SPSS Date & Time Variables(SPSS 日期和时间变量)

SPSS 字符串转换为日期变量示例

“我的数据中有一个字符串变量,它包含的日期格式为 ‘01JAN2016’,日期、月份和年份之间没有分隔符。更糟糕的是,月份缩写是荷兰语,其中 3 个与英语对应词不同。如何将此字符串更改为 SPSS 日期变量?”

步骤 1:添加分隔符

数据位于 stringdates.sav 中。通常,ALTER TYPE(更改类型) 是完成此任务的方法,但缺少日-月-年分隔符会带来问题。解决方案是将 CONCAT(连接) 与 CHAR.SUBSTR(字符截取) 结合使用来添加分隔符。我们将在一个新的 字符串变量(string variable) 中执行此操作,因为这允许我们检查转换是否成功。

语法 1

***创建新的日期变量作为字符串。
**
string newdate(a11).

***将旧字符串中的日、月、年添加到新字符串,并用破折号分隔这些组成部分。
**
compute newdate = concat(
char.substr(mydate,1,2), /*从第 1 个字符开始,提取 2 个字符(日)*/
'-',
char.substr(mydate,3,3), /*从第 3 个字符开始,提取 3 个字符(月)*/
'-',
char.substr(mydate,6,4) /*从第 6 个字符开始,提取 4 个字符(年)*/
).

***检查结果是否符合预期。
**
execute.

***将带有破折号的字符串日期转换为 SPSS 日期变量。
**
alter type newdate (date11).

步骤 2:检查结果

ALTER TYPE(更改类型) 的一个巨大缺陷是,如果它无法转换一个或多个值,则可能会导致 系统缺失值(system missing values)而不会引发任何错误或警告。如果在较大的数据集中未能检测到这一点(并非不可能),可能会导致严重偏差的结果。因此,我们将标记那些在新日期变量上具有系统缺失值,但在输入变量上_没有空字符串值_的个案(如果有)。

语法 2

***ALTER TYPE 可能会导致系统缺失值,而不会出现错误或警告,因此请检查此处是否是这种情况。
**
compute flag = (missing(newdate) & mydate <> '').

***将标记的个案(如果有)移动到数据集的顶部。
**
sort cases by flag(d).

结果

SPSS ALTER TYPE 转换失败

步骤 3:替换一些月份缩写

请注意,我们标记了一些转换失败,但输入变量上具有空字符串值的个案不是其中之一。荷兰语月份缩写(例如 “MRT” 而不是 “MAR”)是造成这种情况的原因。幸运的是,英语和荷兰语之间只有 3 个月份缩写不同。 我们现在将把我们的结果变量转换回字符串,然后重新计算它。完成此操作后,我们将使用 REPLACE(替换) 函数在 DO REPEAT(重复执行) 循环中替换三个不同的缩写。完成此操作后,我们将成功地将我们的新变量转换为日期变量。

语法 3

***删除标记。
**
delete variables flag.

***将 newdate 更改回字符串。
**
alter type newdate(a11).

***像以前一样重新计算 newdate。
**
compute newdate = concat(
char.substr(mydate,1,2), /*从第 1 个字符开始,提取 2 个字符(日)*/
'-',
char.substr(mydate,3,3), /*从第 3 个字符开始,提取 3 个字符(月)*/
'-',
char.substr(mydate,6,4) /*从第 6 个字符开始,提取 4 个字符(年)*/
).

***用它们的英文对应词替换 3 个荷兰语缩写。
**
do repeat #old = 'MRT' 'MEI' 'OKT' /#new = 'MAR' 'MAY' 'OCT'.
compute newdate = replace(newdate,#old,#new).
end repeat.

***检查结果是否符合预期。
**
execute.

***转换为 SPSS 日期变量 - 第二次尝试。
**
alter type newdate(date11).

结果

SPSS REPLACE 函数示例

正如我们很容易看到的,我们的转换现在已经完全成功。在较大的数据集中,您可能希望像我们之前所做的那样,通过标记转换失败来更仔细地检查结果。