计算数据框中两列日期之间的天数

时间:2012-07-26 09:21:25

标签: r

我有一个数据框,其中有两列日期格式为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)

计划使用&#34; cbind&#34;或等同于结合数据框架的东西&#34;天&#34;到我的数据框&#34;调查&#34;其中有数据。

虽然这不会给我任何错误,但是&#34;完成&#34;并且&#34;开始&#34;对象都是&#34; NA_real _&#34;,因此date_diff数据框的所有观察结果都列为NA。

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

提前致谢

5 个答案:

答案 0 :(得分:47)

如果没有您看到您的数据(您可以使用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

答案 1 :(得分:37)

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

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

答案 2 :(得分:3)

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

例如

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

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

做一个 typeof运算(XD) 将其显示为双重即。自1970年以来的几天。

答案 3 :(得分:0)

在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

答案 4 :(得分:0)

下面是Ronald示例,我想补充一点,应该考虑两个日期之间的天数中是否必须包括起始日期和结束日期。我遇到了同样的问题,最终使用了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