簡體   English   中英

r - 發現工作日之間的差異

[英]r — finding difference between business days

我在[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)

我已經嘗試過使用dateTime(),但它不會在周末和假期出現問題。 任何建議將不勝感激,謝謝。

基本Date類型適用於日歷日,但不適用於工作日。 你需要額外的邏輯來照顧工作日。 我知道兩項努力:

  1. 作為rMetrics一部分的timeDate包有許多日歷

  2. 我的RQuantLib包也可以依靠QuantLib的邏輯來實現

這里只是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>     

R>        from <- as.Date("2009-04-07")
R>        to<-as.Date("2009-04-14")
R>        businessDaysBetween("UnitedStates", from, to)
[1] 5
R> 

這是一個小功能,允許您輸入開始日期,結束日期和與假期相對應的日期向量(如果您使用的是非標准假日日歷,則非常有用)並返回它們之間的工作日數,同時計算兩個開始日期和結束日期

workdays = function(iniDate, endDate, holidays) {
  theDates = seq(from=iniDate,to=endDate,by="day")
  isHoliday = theDates %in% holidays
  isWeekend = (as.POSIXlt(theDates)$wday) %in% (c(0,6))
  return (sum(!isHoliday & !isWeekend))
}

我假設在第2個工作日和第5個工作日,您指的是每個月數據中實際存在的第2天和第5天的數據。 如果這是問題,那么如下。 我們讀入數據並將第一列轉換為"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)

使用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)

更新因為這是第一次寫入read.tabletext=參數和在R中添加了read.zoo並且答案已經更新以使用它。

您可以使用套餐bizdays找到工作日之間的差異,但您必須有一個假期列表(非工作日),而這不是您的情況。 無論如何,我認為它可以幫助別人。

使用bizdays,以下代碼將計算兩個日期之間的工作日數。

library(bizdays)
cal <- Calendar(holidaysANBIMA, weekdays=c('sunday', 'saturday'), dib=252)
from_dates <- c('2013-07-12', '2012-06-13')
to_dates <- seq(as.Date('2014-02-17'), as.Date('2016-07-21'), by='months')
bizdays(from_dates, to_dates, cal = cal)

##  [1]  153  442  194  483  234  526  276  570  321  613  364  655  404  695
## [15]  446  735  486  779  529  822  571  863  614  904  654  946  695  987
## [29]  738 1029

編輯:

從1.0.0版開始,bizdays帶有一些內置的日歷

library(bizdays)
from_dates <- c('2013-07-12', '2012-06-13')
to_dates <- seq(as.Date('2014-02-17'), as.Date('2016-07-21'), by='months')
bizdays(from_dates, to_dates, cal = "Brazil/ANBIMA")

不推薦使用Calendar功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM