2017-01-27 10 views
0

두 개의 열이있는 data.frame이 있습니다. 둘 다 문자로 표시된 날짜 :r의 복잡한 날짜 조작

a <- c("01-01-2007 00:00:00", "01-02-2007 00:00:00", "03-05-2007 00:00:00", "31-08-2007 00:00:00") 
b <- c("01-01-1960 01:25:30", "01-01-1960 1:05:36", "01-01-1960 02:25:59", "01-01-1960 1:20:30") 
df <- as.data.frame(cbind(a,b)) 
df 
        a     b 
1 01-01-2007 00:00:00 01-01-1960 01:25:30 
2 01-02-2007 00:00:00 01-01-1960 1:05:36 
3 03-05-2007 00:00:00 01-01-1960 02:25:59 
4 31-08-2007 00:00:00 01-01-1960 1:20:30 

첫 번째 열에는 필요한 날짜가 있지만 시간이 잘못되었습니다. 두 번째 열의 시간은 정확하지만 날짜는 정확하지 않습니다. 두 번째 열에는 일부 행의 시간에 단 하나의 숫자 만있는 문제가 있습니다.

내가 필요한 것은 시간별 빈도를 나타내는 데 사용할 수있는 시간 형식의 두 열 사이를 병합하는 것입니다.

여러 가지 조합을 시도하여 두 열을 병합했지만 항상 오류가 발생합니다. as.Date() 시간이 필요하지 않으며 as.POSIXct을 data.frame에 적용 할 수 없습니다.

몇 가지 도움을 주시면 감사하겠습니다.

감사

답변

2

를 (그냥 가정 중간에 공간이 있음) :

df$good_string = paste(gsub(pattern = " .*", "", x = df$a), gsub(pattern = ".* ", "", df$b), sep = " ") 
df$parsed_date = as.POSIXct(df$good_string, format = "%d-%m-%Y %H:%M:%S") 
df[3:4] 
#   good_string   parsed_date 
# 1 01-01-2007 01:25:30 2007-01-01 01:25:30 
# 2 01-02-2007 1:05:36 2007-02-01 01:05:36 
# 3 03-05-2007 02:25:59 2007-05-03 02:25:59 
# 4 31-08-2007 1:20:30 2007-08-31 01:20:30 
+0

완벽하게 작동합니다. – Xbel

0

lubridate 패키지를 사용해보십시오 :

library(lubridate) 

a <- c("01-01-2007 00:00:00", "01-02-2007 00:00:00", "03-05-2007 00:00:00", "31-08-2007 00:00:00") 
b <- c("01-01-1960 01:25:30", "01-01-1960 1:05:36", "01-01-1960 02:25:59", "01-01-1960 1:20:30") 
df <- as.data.frame(cbind(a,b)) 
df 

hr <- hour(parse_date_time(b, "dmy HMS")) 
minu <- minute(parse_date_time(b, "dmy HMS")) 
sec<- second(parse_date_time(b, "dmy HMS")) 

getDate <- as_date(parse_date_time(a, "dmy HMS")) 
getTime <- paste(hr, minu, sec, sep = ":") 

as_datetime(paste(getDate, getTime)) 
1

기본 기능을 사용하여, 우리가 할 수있는 : 함께 올바른 부품을 얻을 수 regex를 사용

a = as.POSIXct(a, '%d-%m-%Y %H:%M:%S', tz = "GMT") 
b = as.POSIXct(b, '%d-%m-%Y %H:%M:%S', tz = "GMT") 
df <- data.frame(a,b) 
df$merged = paste(strftime(df$a, '%d-%m-%Y', tz = "GMT"), strftime(df$b, '%H:%M:%S', tz = "GMT")) 
df 

# 
#   a     b    merged 
# 1 2007-01-01 1960-01-01 01:25:30 01-01-2007 01:25:30 
# 2 2007-02-01 1960-01-01 01:05:36 01-02-2007 01:05:36 
# 3 2007-05-03 1960-01-01 02:25:59 03-05-2007 02:25:59 
# 4 2007-08-31 1960-01-01 01:20:30 31-08-2007 01:20:30