Stata 循环日期

Stata 循环日期,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' }

我正试着在斯塔塔重复约会

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

比如说,

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
}
forvalues day=1/31{
如果“天”小于10{
本地文件日期=“2017-07-0‘天”
di‘存档日期’
}
否则{
本地文件_date=“2017-07-‘天’”
di‘存档日期’
}
*在此插入操作
}
正在打印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
}
forvalues day=1/31{
如果“天”小于10{
本地文件\u date=“2017070`天”
di‘存档日期’
}
否则{
本地文件\u date=“201707`天”
di‘存档日期’
}
*在此插入操作
}

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

可以先排除一些小的混淆:

  • 在Stata的意义上,这里没有字符串变量,只有本地宏

  • Stata没有日期类型的变量类型。Stata当然有处理日期的方法,但没有专门的日期类型

  • 关键的一点是,当您键入一个包含对本地宏(或全局宏;这里没有,但原理相同)的引用的命令时,会发生什么

  • 所有宏引用都将替换为宏的内容

  • 然后Stata按原样执行命令(尽其所能;显然,这必须是合法的)

  • 第一次循环时,本地宏引用被解释,因此第一个
    di
    display
    )命令现在读取

    di 2017-07-01
    
    你倾向于将其视为约会,但
    display
    无法读懂你的心思。它看到一个要计算的表达式;这是它的工作的一部分,作为一个计算器,然后显示结果。因此,它看不到连字符,而是负号(数字中始终允许使用前导零,就像0.1和0.1一样)。所以,它被评估为2017减去7减去1,为什么你看到2009年应该是清楚的

    解决方案很简单:使用
    “”
    显示
    指示您将字符视为一个文本字符串,以便在出现时显示

    下面是我将如何重写您的代码:

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

    有关回路01、02、…、09、10、…,的更清洁方式,请参阅。。。31.

    我知道是什么导致了这个错误。谢谢你提高了我对Stata的理解!