2015-09-15 105 views
3

Stata中的%tw格式的格式爲:1960w1,它在R中沒有等效物。 因此必須對%tw日期進行後處理。後處理a Stata%tw日期R

將一個.dta文件導入到R中,日期是1304(而不是1985w5)或1426(而不是1987w23)的整數。如果這是一個簡單的時間系列中,您可以設置起始日期如下:

ts(df, start= c(1985,5), frequency=52) 

另一種可能性是:

as.Date(Camp$date, format= "%Yw%W" , origin = "1985w5") 

但是,如果各行沒有一個日期,則必須將其轉換。

ISOweek包基於ISO-8601形式「1985-W05」,並且不處理Stata%tw。

Lubridate軟件包不支持這種格式。 week()返回在日期和1月1日之間發生的完整的七天期間的數量加上一個。 week function

在Stata的任何一週的第1周從1月1日開始,無論一週中的哪一天。 Stata Documentation on Dates

在R中的日期格式%W中,周開始爲星期一,即星期的第一天。

從strptime%V是

年爲十進制數(00--53)的周爲ISO 8601 定義如果本週含1月1日(星期一開始)有四個或在新的一年多天,然後它被認爲是周1。否則, 是前一年的最後一週,下一週是1周 (接受但被忽略的輸入。)Strptime

Larmarange在Github上指出Haven doesn't interpret dates properly

月份,周,季度和半年分別是Stata, 的具體格式,%tm,%tw,%tq和%th。我不確定在R中有沒有 對應的格式。到目前爲止,它們被導入爲 整數。

有沒有辦法將Stata%tw轉換爲日期格式R理解? Here is an Stata file with dates

回答

5

這不會是R代碼的答案,但它是對Stata星期的評論,不能用於評論。

嚴格來說,Stata中的日期是而不是,這些顯示格式由人們理解的顯示格式定義。 Stata中的日期始終是一個數值變量或標量或宏,其起源於1960年的第一個實例。因此,它最好是一個簡寫說明%tw日期等。我們可以使用display來查看不同日期顯示的影響格式:

. di %td 0 
01jan1960 

. di %tw 0 
1960w1 

. di %tq 0 
1960q1 

. di %td 42 
12feb1960 

. di %tw 42 
1960w43 

. di %tq 42 
1970q3 

上面作出了明確一個微妙的一點是什麼存儲,改變顯示格式不會改變,即數值。

否則,Stata中的日期不是截然不同的數據類型;它們只是用適當的顯示格式可以理解爲日期的整數。

該問題的前提是以Stata星期來描述某些每週日期是正確的。這似乎不太可能,因爲我不知道StataCorp之外的機構使用Stata的周規則的情況,不僅第1周始終在1月1日開始,而且52周總是包含8或9天,因此存在從未在一個日曆年53周。

所以,你需要去上游找出數據應該是什麼。如果沒有做出解釋,我的最佳建議是將每年的52周映射到開始日期,即每個日曆年的第1(7)358天。

Stata的周不會用於限定周映射一到一至任何其他方案。

this article on Stata weeks

2

它並不完全清楚是什麼問題,但年份和星期對應1304:

wk <- 1304 
1960 + wk %/% 52 
## [1] 1985 

wk %% 52 + 1 
## [1] 5 

這樣假設一年的第一週爲1周開始1月1日,上週開始的日期是:

as.Date(paste(1960 + wk %/% 52, 1, 1, sep = "-")) + 7 * (wk %% 52) 
## [1] "1985-01-29"