我在[r]数据框中有几年的数据(仅限工作日(没有周末或假日)),并希望找到每个月的第2个工作日和第5个工作日的数据之间的差异.因此,解决方案需要通过列表,确定第2个和第5个工作日,获取相应日期的数据和完整日期,然后找出差异.
数据看起来像:
1/19/1990 1.22
1/20/1990 1.25
1/23/1990 1.26 ## (Gap in date is weekend)
...
2/1/1990 1.34
2/2/1990 1.36
2/5/1990 1.22 ## (Gap in date is weekend)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用dateTime(),但它不会在周末和假期出现问题.任何建议将不胜感激,谢谢.
Dir*_*tel 15
基本Date类型适用于日历日,但不适用于工作日.你需要额外的逻辑来照顾工作日.我知道两项努力:
这里只是RQuantLib的两个例子,还有许多相关的其他功能:
R> from <- as.Date("2009-04-07")
R> to <-as.Date("2009-04-14")
R> getHolidayList("UnitedStates", from, to)
NULL
R> to <- as.Date("2009-10-7")
R> getHolidayList("UnitedStates", from, to)
[1] "2009-05-25" "2009-07-03" "2009-09-07"
R>
Run Code Online (Sandbox Code Playgroud)
和
R> from <- as.Date("2009-04-07")
R> to<-as.Date("2009-04-14")
R> businessDaysBetween("UnitedStates", from, to)
[1] 5
R>
Run Code Online (Sandbox Code Playgroud)
我假设第二个和第五个工作日是指每月数据中实际存在的数据的第二天和第五天。如果这是问题,那么如下。我们读入数据并将第一列转换为"Date"类。然后我们按月汇总数据,并计算所需的差异。
Lines <- "1/19/1990 1.22
1/20/1990 1.25
1/23/1990 1.26
1/24/1990 1.26
1/25/1990 1.26
1/26/1990 1.26
2/1/1990 1.34
2/2/1990 1.36
2/5/1990 1.22
2/6/1990 1.22
2/7/1990 1.22
2/8/1990 1.22"
DF <- read.table(text = Lines, col.names = c("Date", "Value"))
DF$Date <- as.Date(DF$Date, "%m/%d/%Y")
aggregate(DF$Value, list(ym = format(DF$Date, "%Y-%m")),
function(x) if (length(x) >= 5) x[5] - x[2] else NA)
Run Code Online (Sandbox Code Playgroud)
使用 Zoo 和 chron 可以完全通过以下方式完成read.zoo:
library(zoo)
library(chron)
read.zoo(text = Lines, FUN = chron, FUN2 = as.yearmon,
aggregate = function(x) if (length(x) >= 5) x[5] - x[2] else NA)
Run Code Online (Sandbox Code Playgroud)
更新 由于这是第一次将text=参数写入read.table并read.zoo添加到 R 中,并且答案已更新为使用它。