2017-05-09 65 views
1

我有一些時間數據作爲數據集的一部分 - 讓我們調用df,這是一種使操作變得困難的格式。我們稱這個時間變量爲「時間」。這裏的數據的一些示例:處理非標準時間數據

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

正如你可以看到,可變列開始與給定的日期(月/日/年),然後將時間之後的時間(小時,分鐘)一個給定的事件發生在同一天。

是否有可能將月份,日期和年份的值減少到相應的小時和時間值?我希望我的數據最終看起來像這樣:

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 

謝謝!

+1

燦你最好解釋一下小時/分鐘的數據。它從何而來?此外,在某些行中,您只有年份或日/月的組合,這意味着如果我正確理解您的問題,將無法獲得統一的D/M/Y/H/S格式。 – Prometheus

+0

@Prometheus其中斜槓的條目是日期,每個日期下面的四位數字是時間(儘管沒有冒號)。因此,2012年12月17日df $ time下的第三行將是19:50。 – lecreprays

回答

2

首先轉換您小時的格式:

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") 
+0

這似乎工作得很好,謝謝!我將不得不閱讀正則表達式。 – lecreprays

0

A dplyr樣式答案使用na.locfzoo。他的作品以「/」存在分離的日期和時間爲單獨的列,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