Stata 中经常需要对 字符变量
做处理,将 字符变量
转换为 数值变量
。但 字符变量
的形式多样,包括 标识符变量/分类变量
、日期变量
、纯数字变量
等,在转换过程中需要使用不同的转换方法。尤其当字符串内容为数字时(如 日期变量
、纯数字变量
),需要格外小心。
本篇推文将提供七个建议,涵盖多种字符串形式的处理方法,帮助大家更好的处理字符型变量。
1. 保留备份
1.1 保留原始数据
-
保留原始 dta 数据 使用 save
命令将修改后的数据另存为新的 .dta 文件,不要直接修改替换原始数据。 -
保留导入的原始数据 不要丢弃用于导入( import
)数据的任何原始数据文件,例如文本或电子表格文件。有时,可能需要返回到源头并重新开始数据导入和处理工作。
1.2 保留原始变量
因为字符串转换很容易出错,所以在字符串操作过程中,通常生成一个新的变量来保存转换结果,而不是替换原有的字符串变量。有些命令提供 replace
选项,可以将原始变量替换为转换后的结果,但这种情况下,如果转换出错将找不到原始的字符串变量。更好的方式是使用 generate()
选项生成新的变量,如果出现错误,也可以回到原始变量,重新修改。
译者注: 需要补充说明的是,如果遵循了第一条建议,即我们的 do 文档 的首行始终是以 import xxx.txt
或 import xxx.xlsx
的方式导入原始 TXT 或 Excel 文档,那么可以在 dofile 中采用 replace
的方式替换到原变量,以免产生过多的新变量。后续处理过程中若需返回,则可以重新导入原始数据。
2. “日期型”字符串变量
使用 list
、edit
或 browse
命令查看字符串变量,如果变量中包含形如 20jan2010 09:15:22
、20/01/2010
、2010w3
、2010q1
的数据,这种变量就是**“日期型”**字符串变量,通常包含以下几种类型:
日期类型 | 该类型的显示格式 |
---|---|
datetime | 20jan2010 09:15:22.120 |
(daily) date | 20jan2010, 20/01/2010, ... |
weekly date | 2010w3 |
monthly date | 2010m1 |
quarterly date | 2010q1 |
half-yearly date | 2010h1 |
yearly date | 2010 |
2.1 日历年(yearly date)
如果日期型变量是以字符串保存的形如 1984
或 2018
这样的年度日期,可以直接使用 destring
命令转换为数值格式,具体见 help destring
。
2.2 包含日期的字符串变量
如果字符串变量包含日期或时间,需要使用日期-时间函数转换为数字格式的日期或时间变量。具体转换过程可以分为如下两个步骤: Step 1: 使用日期-时间函数 help datetime
,将字符串日期转换为数字日期 Step 2: 使用 format
命令,将数字显示为想要的日期格式
2.2.1 数字日期
数字日期,可以理解为某一日期距离原点的时间间隔。Stata 将 1960 年的第一个日期设为原点 0(如:日度数据的原点为 1960年1月1日
;月度数据的原点为 1960 年第 1 月
;周数据的原点为 1960 年第 1 周
)。不同的日期类型,计算时间间隔的单位不同(如:日度数据为 间隔天数
,月度数据为 间隔月数
,周数据为 间隔周数
)。
以日度数据为例,1776年7月4日
的数字日期是 -67019
,表示 1960年1月1日
之前的第67019
天。从这里可以看出一个问题:对于字符串日期来说,含义是很直观的;但对于数字日期,含义通常比较模糊(如 67019
),很难直观判断这个数字代表的是什么日期。可以通过 format
命令,将数字日期显示为日期格式,详情参见 help format
。
format
的语法为 format varlist %fmt
,其中 varlist
为数字日期变量,%fmt
为显示的日期格式,需要与日期类型相对应(如:日度数据的日期格式为 %td
)。常见的日期类型与对应的日期显示格式如下表所示:
日期格式 %fmt | 日期类型 | 举例 |
---|---|---|
%tc | date/time | format var |