【问题标题】:Date manipulation in data.table and Rdata.table 和 R 中的日期操作
【发布时间】:2013-06-03 19:32:34
【问题描述】:

我有一个每月股票收益的data.table,每行都有一个股票ID字符串CUSIP,以数字形式返回RET,数据时间戳为Date。

例如:

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 合并。我一直在做的方式是添加两列,月份和年份,其中包含时间戳的月份和年份。然后使用整数算术移动列。因此,将 dat 向后移动 x:

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

通过这两列合并是可行的,但它非常不雅。有没有简单的解决方案?

【问题讨论】:

  • 你能显示dput(returns)吗?我不确定“日期”有什么类。反正正常日期可以rounded:?round.POSIXt
  • library(zoo); as.Date(as.yearmon(date) - x/12, frac = 1) 会将日期设置为前 x 个月的月底。如果 data.table 滚动连接适用于此,您可能可以完全避免滞后,但需要对问题进行完整描述才能真正了解。
  • 嗨,这是 dput 的输出(注意大约有 2 个: structure(list(CUSIP = "02314110", RET = 0.059701, Date = structure(-2892, class= "Date") ), .Names = c("CUSIP", "RET", "日期"), class= c("data.table", "data.frame"))
  • 另外补充一点,大约有 250 万行需要处理,所以我一直在努力寻找一个快速简单的解决方案。

标签: r date data.table


【解决方案1】:

这是你想要的吗?

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

【讨论】:

  • 太好了,感谢您与 data.table 的完美配合。只是为了挑选你的大脑,你会建议1)滞后一年(2001-01-15到2000-01-15)和2)滞后两个月(2001-01-15到2000-11-15) ?
  • 您将遇到闰年之类的问题,以及滞后两个月对于“2001-04-30”意味着什么;忽略闰年问题的逐年滞后的简单解决方案是d-365;我想你也可以像d-60 这样滞后两个月,但由于这不是一个定义明确的概念,输出也不会很好定义
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
相关资源
最近更新 更多