2013-06-03 85 views
0

我有一個每月股票收益的data.table,每一行都有一個股票ID字符串CUSIP,返回RET的數字和數據時間戳記爲Date。data.table中的日期操作和R

例如:

returns = 

CUSIP  RET  Date 
"1000" -0.11 2001-01-15 
"1000" 0.05 2001-02-18 

我想了一天設置到月底,並在一個月減去的日期,以便RET有效地借一個月滯後,是這樣的:

returns_modified = 

CUSIP  RET  Date 
"1000" -0.11 2000-12-31 
"1000" 0.05 2001-01-31 

我需要這個的原因是,我可以將滯後收益數據與另一個data.table包含有關股票的月度信息。我一直在做的方式是添加兩個列,分別是包含時間戳的月份和年份的月份和年份。然後使用整數算術來移動列。所以把數據移回x:

Month = (Year*12+(Month-1)-x) %% 12 + 1 
Year = floor(Year*12+(Month-1)-x) 

通過這兩列合併工作,但它非常不雅。有沒有簡單的解決方案呢?

+1

能告訴你'dput(返回)'?我不確定「日期」是什麼類。無論如何,正常的日期可以是'round'ed:'?round.POSIXt' – Frank

+2

'library(zoo); as.Date(as.yearmon(date) - x/12,frac = 1)'將日期設置爲前一個月的第x個月末。如果data.table滾動連接適用於此,您可能可以完全避免落後,但需要對問題進行完整描述才能真正知道。 –

+0

嗨,這是dput的輸出(注意大約有2個: 結構(list(CUSIP =「02314110」,RET = 0.059701,Date = structure(-2892,class =「Date」)),.Names = c(「CUSIP」, 「RET」,「Date」),class = c(「data.table」,「data.frame」)) – tanvach

回答

1

這是你想要的嗎?

d = as.Date('2001-01-15') 
d - as.POSIXlt(d)$mday 
#[1] "2000-12-31" 
+0

非常好,非常感謝你與data.table一起工作得非常好,只要選擇你的大腦,你會有什麼建議1)落後一年(2001-01-15)到2000-01-15)和2)滯後兩個月(2001-01-15至2000-11-15)? – tanvach

+0

你將遇到像閏年這樣的問題,而'2001-04-30'會落後兩個月的意思。針對閏年問題的年度滯後的簡單解決方案是做'd-365';我想你也可以像'd-60'一樣去滯後兩個月,但由於這不是一個非常明確的概念,輸出也不會很好地定義 – eddi