R 非标准时间数据的处理
我有一些时间数据作为数据集的一部分——让我们调用df,它的格式使操作变得困难。让我们称之为时间变量time。以下是一些数据示例: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
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