处理非标准时间数据
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.locf
的 dplyr
风格答案。他的作品是通过“/”将日期和时间分隔成单独的列,用 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
我有一些时间数据作为数据集的一部分——我们称之为 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.locf
的 dplyr
风格答案。他的作品是通过“/”将日期和时间分隔成单独的列,用 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