Stata:将数字添加到日期变量
Stata: adding a number to a date variable
我正在处理入院数据,入院日期和出院日期的信息以时钟格式 %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日开始的毫秒数,甚至会比以前少。
知道我做错了什么吗?
执行摘要:将常量添加到以毫秒为单位的日期时间变量会创建另一个日期时间变量。两个变量的类型都应为 double
。
首先注意时钟不是Stata中的存储格式。时钟日期时间变量存储为整数; clock format是一种数字显示格式,区别比较大。事实上,原始问题中的描述是倒退的:日期时间数据以字符串形式到达,然后使用 clock()
函数将其转换为毫秒。
时钟日期时间应该存储为 double
s 是正确的,因为它们通常是非常大的整数,但正是由于这个原因,您移动的日期时间(比原始值多 1 分钟) 不应存储在 float
中,这是您的 generate
默认情况下所做的。您需要在 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
中可以容纳的值大几个数量级。 help data types
显示各种类型的值限制。
我正在处理入院数据,入院日期和出院日期的信息以时钟格式 %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日开始的毫秒数,甚至会比以前少。
知道我做错了什么吗?
执行摘要:将常量添加到以毫秒为单位的日期时间变量会创建另一个日期时间变量。两个变量的类型都应为 double
。
首先注意时钟不是Stata中的存储格式。时钟日期时间变量存储为整数; clock format是一种数字显示格式,区别比较大。事实上,原始问题中的描述是倒退的:日期时间数据以字符串形式到达,然后使用 clock()
函数将其转换为毫秒。
时钟日期时间应该存储为 double
s 是正确的,因为它们通常是非常大的整数,但正是由于这个原因,您移动的日期时间(比原始值多 1 分钟) 不应存储在 float
中,这是您的 generate
默认情况下所做的。您需要在 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
中可以容纳的值大几个数量级。 help data types
显示各种类型的值限制。