获取每个11月的第四个星期三R
我有一个时间索引矩阵(xts对象),我只想每个十一月的第四个星期三。获取每个11月的第四个星期三R
require(quantmod)
getSymbols("^GSPC", from="1900-01-01") #returns GSPC
GSPC$WED <- weekdays(time(GSPC)) == "Wednesday"
GSPC$NOV <- months(time(GSPC)) == "November"
G <- GSPC[GSPC$WED==1 & GSPC$NOV==1]
这就像我在R得到解决我的问题,我踢了bash。
write.zoo(G, "wen_in_nov")
我做了下面的技巧:
cat wen_in_nov |
grep -v IND |
cut -c 1-10 |
sed 's/-/ /g' |
awk '{if($3 >= 22 && $3 < 29) print $1, $2, $3, "winner"}' |
sed 's/ /-/g' > fourth_wen
的fourth_wen
文件需要从字符串“赢家”的-
分开,所以我只是在vi这样做。导入到回R:
fourth_wen <- read.zoo("fourth_wen", format="%Y-%m-%d")
而且基本上是第四个星期三在十一月自1950年以来有没有办法用更少的代码做这一切R中?
使用.indexmon等访问POSIXlt值直接
GSPC[.indexmon(GSPC)==10 & .indexmday(GSPC) > 22 & .indexmday(GSPC) < 29
&.indexwday(GSPC) == 3]
GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted
2007-11-28 1432.95 1471.62 1432.95 1469.02 4508020000 1469.02
2008-11-26 852.90 887.68 841.37 887.68 5793260000 887.68
2009-11-25 1106.49 1111.18 1104.75 1110.63 3036350000 1110.63
2010-11-24 1183.70 1198.62 1183.70 1198.35 3384250000 1198.35
2011-11-23 1187.48 1187.48 1161.79 1161.79 3798940000 1161.79
不错。通过去bashscript和后面让我不会犯错误。 – Milktrader
最终用户将不得不记住它使用相同的容易出错的POSIX规范,这个规范的编号从0到11的月份不是很友好。 –
你的表达错过了1961年,1967年,1972年,1978年,1989年,1995年和2006年;看到我编辑的答案。 –
这里有一种方法
nov_dates <- expand.grid(1:30, 11, 1900:2011)
nov_dates <- apply(nov_dates, 1, paste, collapse = "-")
nov_dates <- dmy(nov_dates)
nov_wed <- nov_dates[wday(nov_dates, label = TRUE) == 'Wed']
nov_4wed <- nov_wed[seq_along(nov_wed) %% 4 == 0]
编辑。一个小错误依然存在。如果11月份有5个星期三,这段代码不起作用。一个小小的改正会照顾它,我会很快发布它。下面是正常工作
library(plyr)
library(lubridate)
nov_dates <- expand.grid(day = 1:30, month = 11, year = 1900:2011)
nov_dates <- transform(nov_dates,
date = dmy(paste(day, month, year, sep = "-"))
nov_4_wed <- ddply(nov_dates, .(year), summarize, date[wday(date) == 4][4])
我不花大量的时间与时间序列对象,所以有可能是一个更好的功能比使用substr
提取天(实际上是一个解决方案,我敢肯定有,我只是不知道它从我的头顶上)。但这似乎工作:
rs <- subset(GSPC,weekdays(time(GSPC)) == "Wednesday" &
months(time(GSPC)) == "November" &
as.numeric(substr(time(GSPC),9,10)) >= 22 &
as.numeric(substr(time(GSPC),9,10)) < 29)
我的RcppBDT包有这个功能。
RcppBDT包装部分Boost Date_Time库和Boost Date_Time碰巧有这样的功能。因此,这里是一个快速循环的年份2008至2011年,让每年的第四个星期三在十一月:
R> library(RcppBDT)
Loading required package: Rcpp
Creating a generic function for ‘print’ from package ‘base’ in package ‘RcppBDT’
Creating a generic function for ‘format’ from package ‘base’ in package ‘RcppBDT’
R> for (y in 2008:2011) print(getNthDayOfWeek(fourth, Wed, Nov, y))
[1] "2008-11-26"
[1] "2009-11-25"
[1] "2010-11-24"
[1] "2011-11-23"
R>
这里fourth
,Wed
和Nov
是在包命名空间常量,在底层C对应的enum
类型仿照++库。使用非常简单。
编辑:下面是一个完整的例子全部4日,星期三,在 - 11月自2000年以来我保证,无论周三的GSPC
和矢量Wed
同意同Date
类型。然后,它仅仅是一个坚持Wed
到GSPC
的事情:
R> library(quantmod)
Loading required package: Defaults
Loading required package: TTR
R> getSymbols("^GSPC", from="1900-01-01")
R> Wed <- sapply(2000:2011, function(y) getNthDayOfWeek(fourth, Wed, Nov, y))
R> index(GSPC) <- as.Date(index(GSPC))
R> GSPC[as.Date(Wed)]
GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted
2000-11-22 1347.35 1347.35 1321.89 1322.36 963200000 1322.36
2001-11-28 1149.50 1149.50 1128.29 1128.52 1423700000 1128.52
2002-11-27 913.31 940.41 913.31 938.87 1350300000 938.87
2003-11-26 1053.89 1058.45 1048.28 1058.45 1097700000 1058.45
2004-11-24 1176.94 1182.46 1176.94 1181.76 1149600000 1181.76
2005-11-23 1261.23 1270.64 1259.51 1265.61 1985400000 1265.61
2006-11-22 1402.69 1407.89 1402.26 1406.09 2237710000 1406.09
2007-11-28 1432.95 1471.62 1432.95 1469.02 4508020000 1469.02
2008-11-26 852.90 887.68 841.37 887.68 5793260000 887.68
2009-11-25 1106.49 1111.18 1104.75 1110.63 3036350000 1110.63
2010-11-24 1183.70 1198.62 1183.70 1198.35 3384250000 1198.35
2011-11-23 1187.48 1187.48 1161.79 1161.79 3798940000 1161.79
R>
编辑2作为公共Servive公告,这里是Jeff的答案失败:
R> ind <- .indexmon(GSPC)==10 & .indexmday(GSPC) > 22 & .indexmday(GSPC) < 29
+ & .indexwday(GSPC) == 3
R> index(GSPC)[ind]
[1] "1951-11-28" "1952-11-26" "1953-11-25" "1954-11-24" "1955-11-23"
[6] "1956-11-28" "1957-11-27" "1958-11-26" "1959-11-25" "1960-11-23"
[11] "1962-11-28" "1963-11-27" "1964-11-25" "1965-11-24" "1966-11-23"
[16] "1968-11-27" "1969-11-26" "1970-11-25" "1971-11-24" "1973-11-28"
[21] "1974-11-27" "1975-11-26" "1976-11-24" "1977-11-23" "1979-11-28"
[26] "1980-11-26" "1981-11-25" "1982-11-24" "1983-11-23" "1984-11-28"
[31] "1985-11-27" "1986-11-26" "1987-11-25" "1988-11-23" "1990-11-28"
[36] "1991-11-27" "1992-11-25" "1993-11-24" "1994-11-23" "1996-11-27"
[41] "1997-11-26" "1998-11-25" "1999-11-24" "2001-11-28" "2002-11-27"
[46] "2003-11-26" "2004-11-24" "2005-11-23" "2007-11-28" "2008-11-26"
[51] "2009-11-25" "2010-11-24" "2011-11-23"
和
R> S <- 1951:2011
R> S[!S %in% as.numeric(format(index(GSPC)[ind], "%Y")) ]
[1] 1961 1967 1972 1978 1989 1995 2000 2006
R>
因此,当你使用他的方法时,在六十个样本中缺少八年。
真棒!那么这个软件包是否会对日期进行自然语言处理? – Ramnath
不,我已经提到'第一','第二',...只是常数1,2,3和3。键入“4th,Wed,Nov”比“4,3,11”更容易,但这最终会传递给C++代码。但即使在C++中,您也可以将所有API函数与“4th,Wed,Nov”一起使用,因为它们是适当的Boost命名空间中的枚举。它只是*一个非常聪明的技巧,不需要NLP ;-) –
我正在重新安装Boost来试试这个。 (以为我已经安装了它) – Milktrader
能否请您介绍如何贵wen_in_nov样子? –
Jaypal,你可以将上面的第6行拷贝到R中,并且你应该在工作目录中有文件(当然你需要安装'quantmod') – Milktrader