使用Stata对时间变量进行反字符串处理 [英] Destring a time variable using Stata
问题描述
如何使用Statadestring
时间变量(7:00)?
destring
:但是,:
阻止destring
。然后我尝试了destring, ignore(:)
,但无法进行double
和/或format %tc
。encode
不起作用;recast
不起作用。
我还有一个单独的字符串Date,我可以destring
并将其转换为double
。
我是不是错过了可以将这两个字符串变量(一个日期、一个时间)合并为日期/时间变量,或者destring
分别将它们合并为日期/时间变量是否正确?
推荐答案
简明答案
首先给出底线:可以使用如下操作将保存日期和时间信息的两个字符串变量转换为单个数值日期-时间变量
generate double datetime = clock(date + time, "DMY hm")
format datetime %tc
除了确切的细节将取决于您的日期是如何保存的。
要了解Stata中的日期和时间,没有什么可以替代
help dates and times
如您的经验所示,其他尝试的所有内容都可能是错误的或不相关的,或者两者兼而有之。
更长的答案,解决误解
destring
、encode
和recast
在Stata中将字符串日期和/或时间转换为数字日期和/或时间都(几乎总是)完全错误。(我可以想到一个例外:如果以年为单位的日期以某种方式导入为带有"1960"、"1961"等值的字符串,则destring
将是完全正确的。)
按相反顺序
recast
不适用于任何类型的数字到字符串或字符串到数字的转换。仅recast
在数字类型或字符串类型之间。
/li>encode
本质上是将显而易见的字符串映射到数字,并且(除非您另行指定)将生成整数值1、2、3等等,这对于时间或日期来说通常是非常错误的。destring
正如您所应用的,它意味着字符串时间"7:00"、"7:59"、"8:00"应该是数字的,除非有人愚蠢地添加了不相关的标点符号。但如果去掉冒号:
,就会得到700、759、800等倍,这与时间的标准属性不匹配。例如,"8:00"和"7:59"之间的差异显然是一分钟,但删除信息性标点符号只会得到数字800和759,两者相差41,这是没有意义的。
对于纯时间,您可以设置自己的系统,或使用Stata的日期时间函数。
对于"00:00"和"23:59"之间的时间,您可以使用Stata的Date-Times:
. di %tc clock("7:00", "hm")
01jan1960 07:00:00
. di %tc_HH:MM clock("7:00", "hm")
07:00
对于变量,您需要generate
一个新变量,并确保将其创建为double
。
小于24小时的纯时间(理论上)是1960年1月1日的时间,但您可以忽略这一点。但你需要牢记这一点(经常!)基础数字单位为毫秒。只有这种格式才会提供常规格式的时间。
如果您的时间超过24小时,这可能不是一个好主意。
您自己的系统可以只将"hh:mm"形式的字符串时间转换为分钟,并按这些术语进行计算。对于作为变量保存的时间,最简单的方法是使用split, destring
生成保存小时和分钟的数字变量,然后使用60*小时+分钟。
这篇关于使用Stata对时间变量进行反字符串处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!