56

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

到目前为止,我已经尝试使用这里给出的答案:

计算R中2个日期之间的工作日数

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

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。

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

4

5 回答 5

70

如果您没有看到您的数据(您可以使用 的输出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
于 2012-07-26T09:40:17.373 回答
59

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

df$diff_in_days<- difftime(df$datevar1 ,df$datevar2 , units = c("days"))
于 2015-04-06T19:32:08.497 回答
2

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

例如。

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

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

执行 typeof(xd) 将其显示为双精度即。自 1970 年以来的日子。

于 2012-07-26T09:40:37.610 回答
1

在 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
于 2018-11-06T20:12:55.583 回答
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
于 2020-01-11T15:49:41.013 回答