【问题标题】:Counting the number of days excluding Sundays between two dates and creating a new column in R DataFrame计算两个日期之间不包括星期日的天数并在 R DataFrame 中创建一个新列
【发布时间】:2021-02-02 03:29:19
【问题描述】:

我在 R 中有一个 data.frame,其中包含两个变量,一个是开始日期,一个是结束日期。我想添加一个新列,其中包含两个日期之间的天数,并通过每个间隔中的星期日数减少结果。我尝试如下,但它不起作用:

Data$Start <- as.Date(Data$Start, "%d.%m.%y")
Data$End <- as.Date(Data$End,"%d.%m.%y")

interval <- difftime(Data$Start, Data$End, units = "days")
sundays <- seq(from = Data$Start, to = Data$End, by = "days")
number.sundays <- length(which(wday(sundays)==1))

Data$DaysAhead <- interval - number.sundays

我在 seq() 函数中收到错误消息,它的长度必须为 1,但我不明白如何处理这个问题。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: r date-difference


    【解决方案1】:

    这是一个有效的例子:

    Data <- data.frame(
      Start = c("01.01.2020", "01.06.2020"), 
      End = c("01.03.2020", "01.09.2020")
    )  
    
    Data$Start <- as.Date(Data$Start, "%d.%m.%Y")
    Data$End <- as.Date(Data$End,"%d.%m.%Y")
    
    interval <- difftime(Data$End, Data$Start, units = "days")
    sundays <- lapply(1:nrow(Data), function(i)seq(from = Data$Start[i], to = Data$End[i], by = "days"))
    number.sundays <- sapply(sundays, function(x)length(which(lubridate::wday(x)==1)))
    
    Data$DaysAhead <- interval - number.sundays
    

    问题是seq() 没有矢量化,它假设一个起点和一个终点。如果你把它放在一个循环中(比如lapply()),它会工作并为每个开始和结束时间生成相关的序列。然后您可以使用sapply() 计算出多少个星期日,并且由于返回的值是一个标量,所以来自sapply() 的返回将是一个与interval 长度相同的向量。

    【讨论】:

    • 我通过更新的数据集意识到,当开始日期和结束日期不在同一年时,上述解决方案存在问题。例如,我仍然想计算从 2020 年 12 月 20 日到 2021 年 1 月 10 日的星期日以外的日子。
    • 抱歉,它必须是日期格式"%d.%m.%Y"中的大写“Y”。如果您在上面的开始和结束日期格式命令中更改它,那将起作用。我编辑了答案以解决问题。
    【解决方案2】:

    我通过更新的数据集意识到,当开始日期和结束日期不在同一年时,上述解决方案存在问题。例如,我仍然想计算从 20.12.2020 到 10.01.2021 的星期日以外的日子。在这种情况下显示的错误消息是带有参数“by”的符号是错误的。我只是无法让它运行。如果我改变日期,输出没有意义,而且天数太高。我必须做些什么才能在年底完成这项工作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      相关资源
      最近更新 更多