【问题标题】:Stata: adding a number to a date variableStata:将数字添加到日期变量
【发布时间】:2015-08-24 16:01:21
【问题描述】:

我正在处理入院数据,其中入院日期和出院日期的信息以时钟格式 %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 日以来的毫秒数甚至会比以前少。

知道我做错了什么吗?

【问题讨论】:

  • 时间戳应该以长而不是双倍的形式存储。另外尝试使用一些括号: gen new_discharge_date = dispatch_date + (60*1000)
  • 不是这样。 long 在这里不够用。看我的回答。 (括号很好,但只是装饰性的。)

标签: date time stata clock


【解决方案1】:

执行摘要:将常量添加到以毫秒为单位的日期时间变量会创建另一个日期时间变量。这两个变量都应该是double 类型。

首先请注意,时钟不是 Stata 中的一种存储格式。时钟日期时间变量存储为整数;时钟格式是一种数字显示格式,这是完全不同的。事实上,原始问题中的描述是倒退的:日期时间数据以字符串形式到达,然后使用clock() 函数将其转换为毫秒。

时钟日期时间应该存储为doubles 是正确的,因为它们通常是非常大的整数,但正是出于这个原因,您的偏移日期时间(比原始值多 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 显示了各种类型的值的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-19
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多