我有一个数据框,其中有两列日期格式为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。
如果有人能指出我正确的方向,那就太好了!我发现的所有其他问题似乎都没有处理变量中的日期,而是作为单独的日期,并且将这些技术应用于变量并不适用于我。
提前致谢
答案 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