循环日期

时间:2017-09-26 02:59:21

标签: stata

我正试图在Stata中循环约会。

我有一个问题,因为我相信我的字符串变量被识别为日期类型。

例如,

forvalues day = 1/31 {

    if `day' < 10 {
        local file_date ="2017-07-0`day'" 
        di `file_date'
    }
    else {
        local file_date ="2017-07-`day'"
        di `file_date'
    }

    *insert operation here
}

正在印刷2009年,2008年,2007年等。

即使结果应该是2017-07-01,2017-07-02等。

有没有人知道为什么会这样?

顺便说一下,

forvalues day=1/31 {
    if `day' < 10 {
       local file_date ="2017070`day'" 
       di `file_date'
    }
    else {
       local file_date ="201707`day'"
       di `file_date'
    }

    *insert operation here
}

工作正常,但我想在变量中使用连字符。

1 个答案:

答案 0 :(得分:1)

首先可以清除一些轻微的混淆:

  1. Stata的意义上没有字符串变量,只有本地宏。

  2. Stata没有日期类型的变量类型。 Stata确实有处理日期的方法,但是没有专门的日期类型。

  3. 关键点是当您键入包含对本地宏的引用的命令时(或者就此而言,全局宏;此处没有,但原理相同)会发生什么。

    1. 所有宏引用都将替换为宏的内容。

    2. 然后Stata按原样执行命令(尽其所能;显然,它必须合法才能工作)。

    3. 第一次围绕循环,解释了本地宏引用,因此第一个didisplay)命令现在读取

      di 2017-07-01
      

      您倾向于将其视为约会,但display无法理解您的想法。它看到了要评估的表达;这是其作为计算器然后显示结果的工作的一部分。因此它看不到连字符,而是减号(在数字中总是允许前导零,因为总是允许0.1和.1)。因此,它被评估为2017减7减1 - 为什么你看到2009现在应该清楚。

      解决方案很简单:使用" "display表明您认为字符是文字​​字符串,因为它来自display

      以下是我重写代码的方法:

      forvalues day = 1/31 {
          local Day : di %02.0f `day' 
          local file_date "2017-07-`Day'" 
          di "`file_date'"
          *insert operation here
      }
      

      请参阅this paper了解更简洁的方法来循环01,02,...,09,10,...... 31.