计算字符日期(以天为单位)的时间差异,其中之一也为空格

时间:2020-05-30 07:29:02

标签: r date

我有以下数据,这两列都是日期,必须以天为单位。但是,日期列之一中的大多数值都是空白,因此我必须为它们返回NA。

a b 2012年2月7日
2012年8月18日
2012年8月13日
2012年4月16日
2012年4月26日
2012年3月5日2012年12月5日

09-06-2012
30-05-2012
22-06-2012
2012年5月7日
30-06-2012
2012年9月5日
22-06-2012
2012年2月7日
2012年7月17日
2012年8月17日
2012年7月16日
2012年1月8日
2012年5月8日
2012年8月17日
2012年4月30日
2012年5月7日
2012年7月4日
2012年4月27日
2012年6月21日
2012/03/07
2012年7月21日
24-04-2012
2012年5月6日
2012/03/07
2012年2月4日2012年1月6日

2012年6月4日
15-04-2012
2012年6月16日
2012年1月8日
2012年5月13日
2012年9月7日
2012年9月7日
2012年4月18日
2012年9月8日
2012年10月4日
2012年12月5日
2012年4月4日
2012年4月6日2012年4月6日

15-06-2012
2012年2月7日
2012年5月7日
2012年8月21日
2012年7月19日
2012年6月8日
15-06-2012
2012年6月4日
2012年4月6日
2012年7月23日
2012年6月4日
2012年12月4日2012年11月6日

2012年5月24日
2012年3月8日
2012年4月5日2012年9月5日

2012年7月5日
2012年7月6日
2012年6月7日
2012年7月13日
2012年7月26日
2012年4月26日
22-06-2012
2012年7月26日
2012年12月4日
2012年7月8日
2012年6月27日
2012年3月4日2012年6月6日

2012年4月13日
2012年7月28日
2012年7月5日
2012年6月29日
2012年3月4日2012年6月6日

2012年4月4日
2012年4月4日2012年5月24日

2012年4月4日
2012年5月4日
2012年7月4日
2012年10月4日
2012年11月4日
2012年4月13日
2012年4月13日
2012年4月13日
2012年4月13日
14-04-2012
14-04-2012
14-04-2012
2012年4月18日
2012年4月19日
2012年4月21日
2012年5月25日
2012年5月25日
2012年4月26日
2012年4月26日
2012年4月26日
2012年4月27日
2012年4月30日
2012年4月6日
2012年4月6日
2012年5月6日
2012年5月6日
2012年5月6日
2012年5月6日
2012年5月6日2012年7月16日

2012年6月6日2012年6月29日

我尝试了以下操作,但无法成功

date_strings[date_strings==""]<-NA      # Replaced blank spaces with NA & removed them
head(date_strings)
newdata<-na.omit(date_strings)
str(newdata)

newdata$a<-as.Date(newdata$a,"%m%d%y")
newdata$b<-as.Date(newdata$b,"%m%d%y")


diff_in_days = difftime(newdata$a, newdata$b, units = "days") # days

2 个答案:

答案 0 :(得分:2)

将日期更改为日期类,它将自动将空白变为NA,然后使用difftime减去天。

date_strings[] <- lapply(date_strings, as.Date, format = '%d-%m-%Y')
date_strings$diff_in_days = difftime(date_strings$b, date_strings$a,
                                      units = "days") 

date_strings
#           a          b diff_in_days
#1 2012-07-02       <NA>           NA
#2 2012-08-18       <NA>           NA
#3 2012-08-13       <NA>           NA
#4 2012-04-16       <NA>           NA
#5 2012-04-26       <NA>           NA
#6 2012-05-03 2012-05-12            9

或直接减去

date_strings$diff_in_days = date_strings$b -  date_strings$a

数据

date_strings <- structure(list(a = c("02-07-2012", "18-08-2012", "13-08-2012", 
"16-04-2012", "26-04-2012", "03-05-2012"), b = c("", "", "", 
"", "", "12-05-2012")), class = "data.frame", row.names = c(NA, -6L))

答案 1 :(得分:1)

有了tidyverse,我们可以做到

library(dplyr)
library(lubridate)
date_strings %>% 
    mutate(across(everything(), dmy)) %>%
    mutate(diff_in_days = b - a)
#           a          b diff_in_days
#1 2012-07-02       <NA>      NA days
#2 2012-08-18       <NA>      NA days
#3 2012-08-13       <NA>      NA days
#4 2012-04-16       <NA>      NA days
#5 2012-04-26       <NA>      NA days
#6 2012-05-03 2012-05-12       9 days

数据

date_strings <- structure(list(a = c("02-07-2012", "18-08-2012", "13-08-2012", 
"16-04-2012", "26-04-2012", "03-05-2012"), b = c("", "", "", 
"", "", "12-05-2012")), class = "data.frame", row.names = c(NA, -6L))