在R中输入日期和时间

在R中输入日期和时间,r,dplyr,R,Dplyr,我有一个如下所示的数据集,我正试图估算如下所示的值 ID In Out 4 2019-09-20 21:57:22 NA 4 NA 2019-09-21 5:07:03 当每个ID都有NA的超前和滞后时,我试图估算出前一天的截止时间和第二天的新时间。我是这样做的,但我有错误 df1%>% group_by(ID) %>% mutate(In= ifelse(is.n

我有一个如下所示的数据集,我正试图估算如下所示的值

ID    In                      Out
4   2019-09-20 21:57:22       NA
4   NA                    2019-09-21 5:07:03
当每个ID都有NA的超前和滞后时,我试图估算出前一天的截止时间和第二天的新时间。我是这样做的,但我有错误

  df1%>%
  group_by(ID) %>%
  mutate(In= ifelse(is.na(In) & is.na(lag(Out)),
                        as.POSIXct(as.character(paste(as.Date(In),"05:00:01"))),
                        In)) %>%
  mutate(Out= ifelse(is.na(Out) & lead(In) == "05:00:01",
                       as.POSIXct(as.character(paste(as.Date(Out),"05:00:00"))),
                       Out))
所需的输出将是

ID    In                      Out
4   2019-09-20 21:57:22   2019-09-21 05:00:00
4   2019-09-21 5:00:01    2019-09-21 5:07:03
数据的Dput

structure(list(concat = c("176 - 2019-09-20", "176 - 2019-09-20", 
"176 - 2019-09-20", "176 - 2019-09-20", "176 - 2019-09-21"), 
    ENTRY = structure(c(1568989081, 1569008386, 1569016635, 1569016646, 
    NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), EXIT = structure(c(1569005439, 
    1569014914, 1569016645, NA, 1569042433), class = c("POSIXct", 
    "POSIXt"), tzone = "UTC")), row.names = c(NA, -5L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000000007e21ef0>)
结构(列表(concat=c(“176-2019-09-20”、“176-2019-09-20”), "176 - 2019-09-20", "176 - 2019-09-20", "176 - 2019-09-21"), 入口=结构(c, NA),类=c(“POSIXct”,“POSIXt”),tzone=“UTC”),出口=结构(c(1569005439, 1560104914,1560106645,NA,156042433),类=c(“POSIXct”, “POSIXt”)、tzone=“UTC”)、row.names=c(NA,-5L)、class=c(“data.table”, “data.frame”),.internal.selfref=)
最后,我通过分离日期和时间并将其粘贴回来,获得了所需的输出。显然,这不是实现这一目标的有效方法。也许有人可以建议其他有效的方法来做这件事,这至少给了一些学习

df%>%
  mutate(ENTRY_date = as.Date(ENTRY)) %>%
  mutate(EXIT_date = as.Date(EXIT))%>%
  mutate(ENTRY_time = format(ENTRY,"%H:%M:%S"))%>%
  mutate(EXIT_time = format(EXIT,"%H:%M:%S"))%>%
  mutate(Entry_date1 = if_else(is.na(ENTRY_date)&is.na(lag(EXIT_date)),EXIT_date,ENTRY_date))%>%
  mutate(Exit_date1 = if_else(is.na(EXIT_date)& is.na(lead(ENTRY_date)),ENTRY_date,EXIT_date))%>%
  mutate(Entry_time1 = if_else(is.na(ENTRY_time)&is.na(lag(EXIT_time)),"05:00:01",ENTRY_time))%>%
  mutate(Exit_time1 = if_else(is.na(EXIT_time)& is.na(lead(ENTRY_time)),"04:59:59",EXIT_time))%>%
  mutate(ENTRY1 = as.POSIXct(paste(Entry_date1, Entry_time1), format = "%Y-%m-%d %H:%M:%S"))%>%
  mutate(EXIT1 = as.POSIXct(paste(Exit_date1, Exit_time1), format = "%Y-%m-%d %H:%M:%S"))

首先,使用
dput()
数据对我不起作用。无论如何,如果我正确理解你的问题,你可以这样做:

# load pacakge
library(lubridate)
# replace missing In values with the corresponding Out values,
# setting 5:00:01 as time.
df$In[is.na(df$In)] <- ymd_hms(paste0(as.Date(df$Out[is.na(df$In)]), " 5:00:01"))
# same idea but first we save it as a vector...
Out <- ymd_hms(paste0(as.Date(df$In[is.na(df$Out)]), " 5:00:00"))
# ... then we add one day
day(Out) <- day(Out) + 1; df$Out[is.na(df$Out)] <- Out

你能详细说明一下吗?您想只在上午5点自动执行流程还是参考?你能提供一个更大的可复制的例子吗?谢谢你,不要自动化。参考只是将前一天的时间缩短为上午5点,第二天的时间从上午5:00:01开始
structure(list(In = structure(c(1569016642, NA), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), Out = structure(c(NA, 1569042423), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), .Names = c("In", "Out"), row.names = c(NA, -2L), class = "data.frame")