Stata:在日期变量中添加一个数字

时间:2015-08-24 16:01:22

标签: 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

这只会偶然将出院日期改为一分钟

在上面的例子中,这将改为给我

new_discharge_date 
2009-04-25 9:00 AM

或双重

new_discharge_date
 1556269236224

new_discharge_date和discharge_date之间的差异仅为36224毫秒而不是60000.

问题是系统地发生,有时自1960年1月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显示各种类型的值限制。