Сложные манипуляции с датами в r

У меня есть data.frame с двумя столбцами. Оба, даты как символы:

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.

Буду признателен за помощь.

Спасибо


person Xbel    schedule 27.01.2017    source источник


Ответы (3)


Использование 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
person Gregor Thomas    schedule 27.01.2017

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

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
person dww    schedule 27.01.2017

Попробуйте использовать пакет 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))
person conrad-mac    schedule 27.01.2017