处理非标准时间数据

Dealing with non-standard time data

我有一些时间数据作为数据集的一部分——我们称之为 df,它的格式使操作变得困难。我们称这个时间变量为"time"。下面是一些数据示例:

df$time
12/17/2012
1945
1950
2032
2/24/2012
2206
2209
2211

如您所见,时间变量列以给定日期 (mm/dd/yyyy) 开头,然后是给定事件在同一日期发生的时间 (hhmm)。

是否可以 'carry' 将月、日和年的值降低为相应的小时和时间值?我希望我的数据最终看起来像这样:

df$time
12/17/2012 19:45
12/17/2012 19:50
12/17/2012 20:32
2/24/2012  22:06
2/24/2012  22:09
2/24/2012  22:11

谢谢!

首先将您的小时格式转换为:

time=gsub("^(\d{2})(\d{2})$","\1:\2",time)

然后定位日期的位置:

pos=grep("\d+/\d+/\d+",time)

然后构造你的结果向量:

dates=rep(time[pos],times=(diff(c(pos,length(time)+1))-1))
hours=time[-pos]
time=paste(dates,hours)

最后,如果需要,可以将其转换为POSIXct

time=as.POSIXct(time,format="%m/%d/%Y %H:%M")

使用 zoo 中的 na.locfdplyr 风格答案。他的作品是通过“/”将日期和时间分隔成单独的列,用 na.locf 继承日期,过滤掉原始日期行,将列粘贴在一起,并将其转换为 POSIXct

df <- read.table(text=
"12/17/2012
1945
1950
2032
2/24/2012
2206
2209
2211
", stringsAsFactors = FALSE)
names(df) <- "original_time"

library(dplyr)
library(stringr)
library(zoo)

df %>% 
  mutate(event_date = if_else(str_detect(original_time, "/"), original_time, as.character(NA)),
         event_time = if_else(str_detect(original_time, "/"), as.character(NA), original_time),
         event_date = na.locf(event_date)) %>%
  filter(!is.na(event_time)) %>%
  mutate(event_date_time = paste(event_date, event_time),
         event_date_time = as.POSIXct(event_date_time, format="%m/%d/%Y %H%M")) %>%
  select(event_date_time)

# event_date_time
# 1 2012-12-17 19:45:00
# 2 2012-12-17 19:50:00
# 3 2012-12-17 20:32:00
# 4 2012-02-24 22:06:00
# 5 2012-02-24 22:09:00
# 6 2012-02-24 22:11:00