我正试图在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
}
工作正常,但我想在变量中使用连字符。
答案 0 :(得分:1)
首先可以清除一些轻微的混淆:
Stata的意义上没有字符串变量,只有本地宏。
Stata没有日期类型的变量类型。 Stata确实有处理日期的方法,但是没有专门的日期类型。
关键点是当您键入包含对本地宏的引用的命令时(或者就此而言,全局宏;此处没有,但原理相同)会发生什么。
所有宏引用都将替换为宏的内容。
然后Stata按原样执行命令(尽其所能;显然,它必须合法才能工作)。
第一次围绕循环,解释了本地宏引用,因此第一个di
(display
)命令现在读取
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.