我有一个包含日期的字符对象,如下所示;
Dec-13-17 06:38AM
Dec-11-17 07:30AM
06:35AM
06:20AM
06:15AM
Dec-09-17 01:22PM
Dec-08-17 11:46AM
05:20AM
Dec-08-17 09:38AM
我遇到的问题是其中一些条目缺少日期值。 2017 年 12 月 11 日的 6:35、6:20 和 5:15 均缺失,2017 年 12 月 8 日的 05:20AM 缺失。
我写了一个相当长的 ifelse 语句,它总是通过使用 str_count()
查找下一个完整日期时间来查找下一个完整日期,然后使用 gsub 提取仅日期部分然后粘贴它像这样的现有时间条目;
paste0(gsub( " .*$", "", datetime), <existingdate>)
它非常困惑,因为它包含大量嵌套的 ifelse 语句,但问题是我永远不知道我必须查找不完整条目上方的多少行才能从中提取日期。由于这些数据是从网络上抓取的,因此我的嵌套 if else 语句可能会很长才能适应这一点,而且我确信有更好的方法来做到这一点。
非常感谢任何帮助!
最佳答案
假设输入是下面的 s
,则提取返回它的日期,如果没有给出 dat
,则提取 NA。同时提取给 tim
的时间。在日期上运行 na.locf
以填写缺失的日期并将日期和时间粘贴在一起。
s <- c("Dec-13-17 06:38AM", "Dec-11-17 07:30AM", "06:35AM", "06:20AM",
"06:15AM", "Dec-09-17 01:22PM", "Dec-08-17 11:46AM", "05:20AM",
"Dec-08-17 09:38AM")
library(zoo)
dat <- ifelse(grepl("-", s), sub(" .*", "", s), NA)
tim = sub(".* ", "", s)
dattim <- paste(na.locf(dat), tim)
as.POSIXct(dattim, format = "%b-%d-%y %I:%M%p")
给予:
[1] "2017-12-13 06:38:00 EST" "2017-12-11 07:30:00 EST"
[3] "2017-12-11 06:35:00 EST" "2017-12-11 06:20:00 EST"
[5] "2017-12-11 06:15:00 EST" "2017-12-09 13:22:00 EST"
[7] "2017-12-08 11:46:00 EST" "2017-12-08 05:20:00 EST"
[9] "2017-12-08 09:38:00 EST"
关于r - 用之前的条目填写缺失的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47803528/