2017-09-26 78 views
1

我试图循环播放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年7月1日,2017年7月2日,等

有没有人有线索为什么发生这种情况?

顺便说一句,

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

一些小的混乱,可以清理出的第一方式:

  1. 这里有没有字符串变量在Stata的意义,只是当地的宏。

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

关键的一点是,当你键入包含本地宏引用命令会发生什么(或为此事,全球宏;这里没有,但原理是一样的)。

  1. 所有的宏引用都被宏的内容替换。然后Stata执行命令(尽其最大的能力;显然,它必须是合法的才能工作)。

第一次在你的循环中,本地宏引用解释,所以第一个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。

+0

我看到是什么导致了错误。感谢提高我对Stata的理解! – hard1009