我有这样的数据:
Date Expiry Close
2009-05-01 2009-06-26 12
2009-05-01 2009-05-26 22
2009-05-01 2010-05-23 36
2009-05-01 2009-07-26 32
2009-12-01 2009-12-26 33
2009-12-01 2010-01-24 36
2009-12-01 2010-02-26 32
现在我想为那些到期位于 Date 或 Expiry 所在月份的日期过滤数据(按行) Date 的下一个直接月份。如果 Expiry 超出 Date 的下一个月,我想排除它们。
所以我想要所需的数据:
2009-05-01 2009-06-26 12 #Next immediate month
2009-05-01 2009-05-26 22 #Same Month
2009-12-01 2009-12-26 33 #Same Month
2009-12-01 2010-01-24 36 #Next immediate month
我有POSIXlt格式的日期和到期日期。 请帮忙。我有80000个观察结果。
答案 0 :(得分:1)
我尝试这样一些可读且相当直接的东西。
首先,清理数据帧:
DF <- data.frame(Date= c('2009-05-01', '2009-05-01', '2009-05-01', '2009-05-01', '2009-12-01', '2009-12-01', '2009-12-01'),
Expiry=c('2009-06-26', '2009-05-26','2010-05-23', '2009-07-26', '2009-12-26', '2010-01-24', '2010-02-26'),
Close=c(12,22,36,32,33,36,32))
DF$Date <- as.Date(DF$Date)
DF$Expiry <- as.Date(DF$Expiry)
如果你遇到这样的事情:
2000-12-01 2010-02-26
下一行将删除多年来跳跃的情况。
DF <- DF[which( (year(DF$Expiry) - year(DF$Date)>=0) & (year(DF$Expiry) - year(DF$Date)<2) ),]
第一种情况:获取同一年差异为一个月的所有行。
DF1 <- DF[which( (month(DF$Expiry) - month(DF$Date)>=0) & (month(DF$Expiry) - month(DF$Date)<2) & (year(DF$Expiry) == year(DF$Date))),]
下一个案例:获取差异为一个月的所有行,即到期日期和日期十二月之间。这是几个月以来,12 + 1 = 1。
DF2 <- DF[which( (month(DF$Expiry) ==1) & (month(DF$Date)==12) & (year(DF$Expiry) == (year(DF$Date)+1))),]
total <- rbind(DF1, DF2)
total
应该给你
Date Expiry Close
1 2009-05-01 2009-06-26 12
2 2009-05-01 2009-05-26 22
5 2009-12-01 2009-12-26 33
6 2009-12-01 2010-01-24 36
希望这有帮助。