Date Stata:向日期变量添加数字
我正在处理住院数据,住院日期和出院日期的信息以时钟格式%tcCCYY-NN-DD_hh:MM_am存储,例如Date Stata:向日期变量添加数字,date,time,stata,clock,Date,Time,Stata,Clock,我正在处理住院数据,住院日期和出院日期的信息以时钟格式%tcCCYY-NN-DD_hh:MM_am存储,例如 discharge date 2009-04-21 9:00 AM 因此,从1960年1月1日起,数据信息以毫秒的形式存储,将其转换为数字双变量 discharge date 1556269200000 现在,我想将一些日期变量移动1分钟(只是一个示例),并生成一个新变量 gen new_discharge_date = discharge_date + 60*1000 这只会
discharge date
2009-04-21 9:00 AM
因此,从1960年1月1日起,数据信息以毫秒的形式存储,将其转换为数字双变量
discharge date
1556269200000
现在,我想将一些日期变量移动1分钟(只是一个示例),并生成一个新变量
gen new_discharge_date = discharge_date + 60*1000
这只会使出院日期顺延一分钟
在上面的例子中,这将给我
new_discharge_date
2009-04-25 9:00 AM
还是双倍
new_discharge_date
1556269236224
新的卸货日期和卸货日期之间的差值仅为36224毫秒,而不是60000毫秒
这个问题是系统性的,有时自1960年1月1日以来的毫秒数甚至会比以前更低
知道我做错了什么吗?执行摘要:向日期时间变量添加一个以毫秒为单位的常数会创建另一个日期时间变量。两个变量的类型均应为
double
首先请注意,时钟不是Stata中的存储格式。时钟日期时间变量存储为整数;时钟格式是一种数字显示格式,这是完全不同的。事实上,原始问题中的描述是反向的:日期-时间数据以字符串形式到达,然后使用clock()
函数将其转换为毫秒
时钟日期时间应该存储为double
s,这是正确的,因为它们通常是非常大的整数,但正是出于这个原因,移位的日期时间(比原始值多1分钟)不应该存储在float
中,这是生成的默认值。您需要在generate
语句中指定double
。使用float
只会给出一个粗略的近似值,这就是您观察错误的原因。使用您的示例作为沙箱很容易检查
. clear
. set obs 1
number of observations (_N) was 0, now 1
. gen s_discharge_date = "2009-04-21 9:00 AM"
. gen double discharge_date = clock(s_discharge_date, "YMD hm")
. format discharge_date %tc
. gen double new_discharge_date = discharge_date + 60*1000
. format new %tc
. gen long new_discharge_date2 = discharge_date + 60*1000
. format new_discharge_date2 %tc
. list
+--------------------------------------------------------------+
1. | s_discharge_date | discharge_date | new_discharge_date |
| 2009-04-21 9:00 AM | 21apr2009 09:00:00 | 21apr2009 09:01:00 |
|--------------------------------------------------------------|
| new_di~2 |
| . |
+--------------------------------------------------------------+
上一次实验立即表明,注释中给出的使用long
的建议是错误的。最近的日期时间值以万亿为单位,比长的时间要大一些数量级<代码>帮助数据类型
显示各种类型的值限制 时间戳应以long而不是double格式存储。另外,尝试使用一些括号:gen new_discharge_date=discharge_date+(60*1000)并非如此<代码>长
在这里是不够的。看看我的答案。(括号很好,但只是装饰性的。)