Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 非标准时间数据的处理_R_Date_Time_Lubridate - Fatal编程技术网

R 非标准时间数据的处理

R 非标准时间数据的处理,r,date,time,lubridate,R,Date,Time,Lubridate,我有一些时间数据作为数据集的一部分——让我们调用df,它的格式使操作变得困难。让我们称之为时间变量time。以下是一些数据示例: df$time 12/17/2012 1945 1950 2032 2/24/2012 2206 2209 2211 如您所见,时间变量列以给定日期mm/dd/yyyy开始,然后是给定事件在同一日期发生的时间hhmm 是否可以将月、日和年值“携带”到相应的小时和时间值?我希望我的数据最终如下所示: df$time 12/17/2012 19:45 12/17/201

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

df$time
12/17/2012
1945
1950
2032
2/24/2012
2206
2209
2211
如您所见,时间变量列以给定日期mm/dd/yyyy开始,然后是给定事件在同一日期发生的时间hhmm

是否可以将月、日和年值“携带”到相应的小时和时间值?我希望我的数据最终如下所示:

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")
使用来自动物园的na.locf的dplyr式答案。他的工作方法是:通过存在/将日期和时间分隔为单独的列,使用na.locf结转日期,过滤掉原始日期行,将列粘贴在一起,并将其转换为POSIXct


你能更好地解释一下小时/分钟数据吗。它来自哪里?此外,在某些行中,您只有年或日/月的组合,这意味着如果我正确理解您的问题,就不可能获得统一的D/M/Y/H/S格式。@Prometheus带斜杠的条目是日期,每个日期下面的四位数字是时间,尽管没有冒号。因此,df$时间下的第三行将是2012年12月17日19:50。这似乎效果很好,谢谢!我得好好读一下正则表达式。
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