2016-04-23 79 views
1

我在Stata中遇到了日期格式問題。我相信這是一個非常簡單的問題,但我看不出如何解決它。在Stata中轉換字符串每月日期

我有一個csv文件(FILE.CSV),看起來像

v1   v2 
01/01/2000 1.1 
01/02/2000 1.2 
01/03/2000 1.3 
...  
01/12/2000 1.12 
01/02/2001 1.1 
... 
01/12/2001 1.12 

V1的形式爲dd /月/年。

我使用import delimited ...file.csv

V1是一個字符串變量導入該文件在Stata,v2是一個浮動。

我想將v1轉換成每月 Stata可以讀取的日期。

我嘗試:

1)

gen Time = date(v1, "DMY") 
format Time %tm 

這給了我

Time 
3177m7 
3180m2 
3182m7 
... 

,看起來是錯誤的。

2)在可替換的

gen v1_1=v1 
replace v1_1 = substr(v1_1,4,length(v1_1)) 
gen Time_1 = date(v1_1, "MY") 
format Time_1 %tm 

其給出完全相同的結果。

如果我鍵入

tsset Time, format(%tm) 

它告訴我,有差距,但也有在數據沒有間隙。

你能幫我理解我做錯了什麼嗎?

回答

4

Stata的日期和時間爲wonderful documentation,如果您計劃使用與時間相關的變量,則應該從頭到尾閱讀。閱讀本文檔不僅可以解決當前的問題,還可能有助於避免將來出現代價高昂的錯誤。與您的問題相關的部分標題爲「SIF到SIF的轉換」。 SIF的意思是「Stata內部形式」。

解釋您當前的問題:

Stata將日期存儲爲數字;您在分配格式時將它們解釋爲「日期」。考慮以下幾點:

set obs 1 
gen dt = date("01/01/2003", "DMY") 
list dt 
// 15706 

因此該日期被賦值爲15706.讓我們格式,它看起來像一個日子:

format dt %td 
list 
// 01jan2003 

現在讓我們來格式化它是一個月:

format dt %tm 
list 
// 3268m11 

請注意,dt只是一個數字,您可以像日期或月份那樣進行格式化和使用。從「天數」獲得了「月數」,請執行下列操作:

gen mt = mofd(dt) // mofd = month of day 
format mt %tm 
list 
//  dt  mt 
// 3268m11 2003m1 

變量mt現在等於516。2003年1月是516個月從1960年一月的Stata的「信號出現時間」是1月1日, 1960年00:00:00.000。日期變量存儲爲自紀元時間以來的天數,日期時間變量自紀元時間起以毫秒爲單位存儲。月份變量可以存儲爲自紀元時間以來的月份(這就是%tm格式決定哪個月的顯示方式)。