【问题标题】:calculating number of days between 2 columns of dates in data frame计算数据框中两列日期之间的天数
【发布时间】:2012-07-24 20:31:25
【问题描述】:

我有一个数据框,其中有两列日期,格式为 yyyy/mm/dd。 我正在尝试计算数据框中每个观察值的这两个日期之间的天数(并创建一个包含此天数的新变量)。

到目前为止,我已尝试使用此处给出的答案:

Calculate the number of weekdays between 2 dates in R

但编辑代码以便计算总天数而不仅仅是工作日数。这只是想出了错误说:

Error in del/by : non-numeric argument to binary operator
In addition: Warning message:
In Ops.factor(to, from) : - not meaningful for factors

我也尝试过使用此代码:

finish <- as.Date(survey$date, format="%yyyy/%mm/%dd")
start <- as.Date(survey$tx_start, format="%yyyy/%mm/%dd")
date_diff<-as.data.frame(finish-start)

计划使用“cbind”或等效的东西将数据框“days”与我的数据框“survey”结合起来,其中包含数据。

虽然这没有给我任何错误,但“完成”和“开始”对象中的观察结果都是“NA_real_”,因此 date_diff 数据框的所有观察结果都列为 NA。

如果有人能指出我正确的方向,那就太好了!我发现的所有其他问题似乎都不是在处理变量中的日期,而是作为单独的日期,并且将这些技术应用于变量并没有为我工作。

【问题讨论】:

  • 这段代码对我有用。不确定它是否适合您的示例: d1 = '2012-07-26'; d2 = '1970-12-25'; dd1 = as.Date(d1); dd2 = as.Date(d2); dd1-dd2;
  • 我的主要问题是处理日期列。我有 2 列日期,我想计算这两者之间的天数作为第三列。您的代码有效,但有没有办法对其进行调整,以便处理数据框中的日期列?
  • 引用 d1 和 d2 作为矩阵元素,例如。调查$date 应该可以工作。

标签: r date


【解决方案1】:

在罗纳德示例之后,我想补充一点,应该考虑是否必须在两个日期之间的天数中包含起始日期和结束日期。我遇到了同样的问题,最终使用了第三个选项 apply。这可能是内存效率低下,但有助于理解问题:

   survey <- data.frame(date=c("2012/07/26","2012/07/25"),tx_start=c("2012/01/01","2012/01/01"))

survey$diff_1 <- as.numeric(
  as.Date(as.character(survey$date), format="%Y/%m/%d")-
    as.Date(as.character(survey$tx_start), format="%Y/%m/%d")
)

survey$diff_2<- as.numeric(
  difftime(survey$date ,survey$tx_start , units = c("days"))
)

survey$diff_3 <- apply(X = survey[,c("date", "tx_start")],
                       MARGIN = 1,
                       FUN = function(x)
                         length(
                           seq.Date(
                             from = as.Date(x[2]),
                             to = as.Date(x[1]),
                             by = "day")
                           )
                       )

这给出了以下日期差异:

        date   tx_start diff_1   diff_2 diff_3
1 2012/07/26 2012/01/01    207 206.9583    208
2 2012/07/25 2012/01/01    206 205.9583    207

【讨论】:

    【解决方案2】:

    在 Ronald 的示例中,如果日期格式不同(如下所示),则修改 format 参数

    survey <- data.frame(date=c("2012-07-26","2012-07-25"),tx_start=c("2012-01-01","2012-01-01"))
    
    survey$date_diff <- as.Date(as.character(survey$date), format="%Y-%m-%d")-
                  as.Date(as.character(survey$tx_start), format="%Y-%m-%d")
    

    调查:

       date      tx_start     date_diff
    1 2012-07-26     2012-01-01    207 days
    2 2012-07-25     2012-01-01    206 days
    

    【讨论】:

      【解决方案3】:

      您可以使用函数difftime 找到数据框中各列中日期之间的差异,如下所示:

      df$diff_in_days<- difftime(df$datevar1 ,df$datevar2 , units = c("days"))
      

      【讨论】:

        【解决方案4】:

        如果您没有看到您的数据(您可以使用dput(head(survey)) 的输出向我们展示),这是在黑暗中拍摄:

        survey <- data.frame(date=c("2012/07/26","2012/07/25"),tx_start=c("2012/01/01","2012/01/01"))
        
        survey$date_diff <- as.Date(as.character(survey$date), format="%Y/%m/%d")-
                          as.Date(as.character(survey$tx_start), format="%Y/%m/%d")
        survey
               date   tx_start date_diff
        1 2012/07/26 2012/01/01  207 days
        2 2012/07/25 2012/01/01  206 days
        

        【讨论】:

        • 我有数百个变量,所以刚刚使用该命令在此处显示日期输出的小样本 structure(list(site = c(NA, NA, NA, NA, NA, NA) , 日期 = 结构 (2:7, .Label = c("", "2012/05/01", "2012/05/03", "2012/05/05", "2012/05/07", " 2012/05/09”、“2012/05/11”、“2012/05/13”、“2012/05/15”、“2012/05/17”、“2012/05/19”、“2012/ 05/21",), class= "因素")
        • 运行:survey$date_diff
        • 由于您的日期似乎是因素变量,我将转换为类型字符添加到代码中。
        • survey$date_diff&lt;-as.numeric(survey$date_diff)
        • 太棒了,正是我需要的!非常感谢您的帮助!
        【解决方案5】:

        您需要正确使用 as.Date 格式。

        例如。

        x = '2012/07/25'
        xd = as.Date(x,'%Y/%m/%d')
        xd    # Prints "2012-07-25"
        

        R 日期格式类似于 *nix 格式。

        做一个 类型(xd) 将其显示为双 ie。自 1970 年以来的日子。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-26
          • 2019-09-27
          • 2019-03-26
          • 1970-01-01
          相关资源
          最近更新 更多