首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算最近n个工作日

计算最近n个工作日
EN

Stack Overflow用户
提问于 2011-05-25 01:01:48
回答 2查看 193关注 0票数 3

我在R中有一个函数,给定n天,返回过去n个工作日的列表。我的解决方案运行良好,但感觉不优雅,我想知道是否有任何简单的方法来改进它。

代码语言:javascript
运行
复制
WeekdayList <- function(n) {
    Today <- as.Date(Sys.time())
    days <- c(Today)
    i <- 1
    while (length(days) < n) {
        NewDay <- as.Date(Today-i)
        if (!weekdays(NewDay) %in% c("Saturday", "Sunday")) {
            days <- c(days,NewDay)
        }
        i <- i+1
    }
    days
}

WeekdayList(30)
WeekdayList(2)

排除假日也是一个很好的特性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-25 01:27:03

向量化代码在R中是必不可少的,下面是一个例子:

代码语言:javascript
运行
复制
WeekdayList2 <- function(n) {
  Today <- as.Date(Sys.time())
  dayz <- seq(Today, Today - 2 * n, "-1 days")
  dayz <- dayz[!(weekdays(dayz) %in% c("Saturday", "Sunday"))]
  dayz <- dayz[seq_len(n)]
  return(dayz)
}
identical(WeekdayList2(1000), WeekdayList(1000))
system.time(WeekdayList2(10000))
system.time(WeekdayList(10000))
[1] TRUE
   user  system elapsed 
      0       0       0 
   user  system elapsed 
   4.90    0.00    4.91 

正如您所看到的,尽管我的函数创建的向量是所需大小的两倍(然后删除了周末),但它比使用"for“循环快得多。我的电脑甚至不能用n = 100000运行你的函数(这并不是说你会关心那么多天以前),但WeekdayList2几乎可以立即运行它。

由于假日是相对于您所在的位置而言的,因此您可能需要手动上载日期列表,并添加另一个条件以从数据中筛选出这些日期。

票数 6
EN

Stack Overflow用户

发布于 2011-05-25 02:11:59

我在Rguy的代码中添加了一个假日计算。

代码语言:javascript
运行
复制
WeekdayList3 <- function(n) {
    library(timeDate)
    Today <- as.Date(Sys.time())
    dayz <- rev(seq(Today - 2 * n, Today, "days"))
    years <- as.numeric(unique(format(dayz,'%Y')))
    holidays <- as.Date(holidayNYSE(years))
    dayz <- dayz[!(weekdays(dayz) %in% c("Saturday", "Sunday"))]
    dayz <- dayz[!(dayz %in% holidays)]
    dayz <- dayz[1 : n]
    return(dayz)
}

WeekdayList3(100)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6114083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档