2017-01-27 2 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

Использование regex, чтобы получить правильные части вместе (только принимает на себя площадь посередине):

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

Использование базовых функций, мы можем сделать это:

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 
Смежные вопросы