Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r—查找工作日之间的差异_R - Fatal编程技术网

r—查找工作日之间的差异

r—查找工作日之间的差异,r,R,我在[r]数据框中有几年的数据(仅适用于工作日(无周末或节假日)),我想找出每个月第2个和第5个工作日数据之间的差异。因此,解决方案需要遍历列表,确定第2个和第5个工作日,获取相应日期的数据和完整日期,然后找出差异 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/199

我在[r]数据框中有几年的数据(仅适用于工作日(无周末或节假日)),我想找出每个月第2个和第5个工作日数据之间的差异。因此,解决方案需要遍历列表,确定第2个和第5个工作日,获取相应日期的数据和完整日期,然后找出差异

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)
数据如下所示:

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(),但它并不妨碍周末和假期。如果您有任何建议,我们将不胜感激。

基本的
日期类型适用于日历日,但不适用于工作日。你需要额外的逻辑来处理工作日。我知道有两项努力:

  • 作为rMetrics一部分的软件包有许多日历

  • 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")
    
  • 我的包也可以通过依赖

  • 以下是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>从到getHolidayList(“美国”、从、到)
    无效的
    R> 到getHolidayList(“美国”、从、到)
    [1] "2009-05-25" "2009-07-03" "2009-09-07"
    R>
    

    R>from to businessdays之间(“美国”,from,to)
    [1] 5
    R>
    
    我假设第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)
    

    Update自从第一次编写以来,R中添加了
    read.table
    read.zoo
    text=
    参数,并更新了答案以使用该参数。

    这里有一个小函数,可以让您输入开始日期、结束日期和与假日对应的日期向量(如果您使用的是非标准假日日历,则很有用)并返回两个日历之间的工作日数,同时计算开始日期和结束日期

    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))
    }
    

    你可以在使用该软件包时发现工作日之间的差异,但你必须有一个假期(非工作日)列表,这不是你的情况。无论如何,我认为它可以帮助其他人

    对于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
    
    library(bizdays)
    
    卡尔:老实说,当我读到德克的答案时,我才明白这个问题。我想应该指出的是,“工作日”在特定领域之外并没有很好的定义。例如,许多政府办公室在哥伦布日关闭,但纽约证券交易所却没有。你可以选择哪个“日历”您需要:美国、美国/结算、美国/纽约证交所、美国/政府债券、美国/NERC和WeekendOnly。
    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")