我有一种情况,我有一个data.frame,其中一个向量的日期超过一系列次数,我想转换成某种POSIX日期时间字段。
例如:
“7/16/2014”,“5:06:59 PM”,“11:51:26 AM”,“2014年7月13日”,“3:53:16 PM”, “下午3:24:19”,“上午11:47:49”,“2014年7月12日”,“上午11:57:41”,“2014年7月11日”, “10:01:48 AM”,“7/10/2014”,“4:54:08 PM”,“2:23:04 PM”,“11:34:09 AM”
从概念上讲,似乎要做的是使用正则表达式将此MIXED向量复制到DATEONLY向量和TIMEONLY向量中,因此它们保持相同的位置,然后使用类似tidyr的fill函数填充空白点在DATEONLY向量中,然后重新组合DATEONLY和TIMEONLY列...但是我有点难过从哪里开始。
我想把它作为
出现“2014/7/16 5:06:59”,“2014年7月16日上午11:51:26”,“2014年7月13日3:53:16 PM“等......
答案 0 :(得分:0)
我认为这不是实现任务的简洁方法。但是,以下工作。我无法想出分割矢量(即x)的好主意。所以我决定使用数据框。首先,我创建了一个组变量。为了做到这一点,正如你在问题中提到的那样,我搜索了日期(月/日/年)的索引。使用索引和na.locf()
,我填写组列。然后,我按组拆分数据,并使用stri_join()
处理粘贴日期和时间。最后,我取消列表。如果你想要日期对象,你需要处理它。
library(zoo)
library(magrittr)
library(stringi)
x <- c("7/16/2014", "5:06:59 PM", "11:51:26 AM",
"7/13/2014", "3:53:16 PM", "3:24:19 PM", "11:47:49 AM",
"7/12/2014", "11:57:41 AM", "7/11/2014", "10:01:48 AM",
"7/10/2014", "4:54:08 PM", "2:23:04 PM", "11:34:09 AM")
# Create a data frame
mydf <- data.frame(date = x, group = NA)
# Get indices for date (month/day/year)
ind <- grep(pattern = "\\d+/\\d+/\\d+", x = mydf$date)
# Add group number to the ind positions of mydf$group and
# fill NA with the group numbers
mydf$group[ind] <- 1:length(ind)
mydf$group <- na.locf(mydf$group)
# Split the data frame by group and create dates (in character)
split(mydf, mydf$group) %>%
lapply(function(x){
stri_join(x$date[1], x$date[2:length(x$date)], sep = " ")}) %>%
unlist
11 12 21 22
"7/16/2014 5:06:59 PM" "7/16/2014 11:51:26 AM" "7/13/2014 3:53:16 PM" "7/13/2014 3:24:19 PM"
23 3 4 51
"7/13/2014 11:47:49 AM" "7/12/2014 11:57:41 AM" "7/11/2014 10:01:48 AM" "7/10/2014 4:54:08 PM"
52 53
"7/10/2014 2:23:04 PM" "7/10/2014 11:34:09 AM"