2017-09-26 1 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 
} 

は結果が2017年7月1日、2017年7月2日、など

あるべきにもかかわらず2009年、2008年、2007年、など

を印刷しています

これが起こっている理由を誰かが知っていますか?ところで

は、

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. すべてのマクロ参照は、マクロの内容に置き換えられます。

  2. そして、Stataはそのコマンドをそのまま実行します(能力の最大限にはっきりしていれば、それが有効でなければなりません)。

あなたのループの最初の頃は、地元のマクロ参照が解釈されるため、最初のdidisplay)コマンドは、今あなたが見て傾斜している

di 2017-07-01 

読み取る日付としてではなく、 displayあなたの心を読むことができません。それは評価される式を見る。これは計算機として機能し、結果を表示する仕事の一部です。したがって、ハイフンは表示されませんが、マイナス記号(および先頭のゼロは、常に0.1と常に同じように数字に使用できます)。したがって、それは2017マイナス7マイナス1として評価され、なぜあなたは2009年が明らかになるはずですか。

解決方法は簡単です。displayという文字がリテラル文字列であると考えていることをdisplayに示すには、" "を使用してください。ループ01、02、...、09、10、... 31に

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

がきれいな方法についてthis paper参照してください:ここで

は、私はあなたのコードを書き換えるだろうかです。

+0

エラーの原因を確認します。 Stataの理解を深めてくれてありがとう! – hard1009

関連する問題