我正在处理入院资料,其中有关入院日期和出院日期的信息以时钟格式%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
这只会偶然将出院日期改为一分钟
在上面的例子中,这将改为给我
new_discharge_date
2009-04-25 9:00 AM
或双重
new_discharge_date
1556269236224
new_discharge_date和discharge_date之间的差异仅为36224毫秒而不是60000.
问题是系统地发生,有时自1960年1月1日以来的毫秒数甚至会比以前更低。
知道我做错了吗?
答案 0 :(得分:2)
执行摘要:向单位毫秒的日期时间变量添加常量会创建另一个日期时间变量。两个变量都应该是double
类型。
首先请注意,时钟不是Stata中的存储格式。时钟日期时间变量存储为整数;时钟格式是一种数字显示格式,这是完全不同的。实际上,原始问题中的描述是向后的:日期时间数据以字符串形式到达,然后使用clock()
函数将其转换为毫秒。
你是正确的,时钟日期时间应该存储为double
s,因为它们通常是非常大的整数,但正是因为这个原因你的移位日期时间(比原始值多1分钟)应该不会存储在float
中,这是generate
默认执行的操作。您需要在double
语句中指定generate
。使用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
中的数值大一些数量级。 help data types
显示各种类型的值限制。