2015-10-06 3 views
0

У меня есть следующие символы (образец):Преобразование текста в определенный формат даты в R

>trial 
[1] "9-5" "7-5" "13-3" "17-6" 

И я хочу, чтобы преобразовать их в формат даты (если это возможно) и стать чем-то вроде следующего:

>trial 
[1] Friday 9:00 Friday 7:00 Wednesday 13:00 Saturday 17:00 

Я использую следующий код, который не является желаемым результатом:

>strptime(trial,format="%k-%w") 
[1] "2015-10-06 09:00:00 CEST" "2015-10-06 07:00:00 CEST" 
[3] "2015-10-06 13:00:00 CEST" "2015-10-06 17:00:00 CEST" 

Моя точка зрения заключается в том, что я хочу иметь формат даты по будням и часам. Как это можно сделать?

+0

что-то вроде 'STRFTIME (strptime (trial = "% k-% w"), format = "% A% H:% M") ' –

+0

Помните, что дата считается сегодня, когда она не указана' "Для strptime требуется строка ввода не указывать дату полностью: предполагается, что неуказанные секунды, минуты или часы равны нулю, а неуказанный год, месяц или день - текущий. "' –

+0

Не su почему вы подчеркиваете «формат даты». Если вы хотите объект класса даты, вы не можете настроить его отображение (в отличие от Stata, например). – Frank

ответ

1

Try:

paste(weekdays((as.Date("1970-01-01")+4)+0:7)[as.numeric(sub(".*-(\\d+)", "\\1", trial))], sub("(\\d+).*", "\\1:00", trial)) 
[1] "Friday 9:00"  "Friday 7:00"  "Wednesday 13:00" 
[4] "Saturday 17:00" 

Или объяснить, что происходит, я покажу в промежуточных шагов:

#1. starting vector 
trial <- c("9-5", "7-5", "13-3", "17-6") 

#2. get the hour and add ":00" to the values 
hr <- sub("(\\d+).*", "\\1:00", trial) 

#3. get the day of the week as a number 
d <- as.numeric(sub(".*-(\\d+)", "\\1", trial)) 

#4. pick a week with a Monday date that you know and add 6 days (I use The first Monday after the origin). Subset with 'd' 
day_vector <- weekdays((as.Date("1970-01-01")+4)+0:7)[d] 

#5. paste day and hour together 
paste(day_vector, hr) 

[1] "Friday 9:00"  "Friday 7:00"  "Wednesday 13:00" 
[4] "Saturday 17:00" 
2

Вот что я мог бы сделать:

library(data.table) # for wday & tstrsplit 

a_wk <- Sys.Date()+1:7 
wdays <- weekdays(a_wk)[ order(wday(a_wk)) ] 
# "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" 

data.table(trial)[,tstrsplit(trial, "-", type.convert=TRUE)][, 
    paste0(wdays[V2 + 1], " ", V1, ":00") 
] 
# "Friday 9:00"  "Friday 7:00"  "Wednesday 13:00" "Saturday 17:00" 

+ 1 необходим, потому что функция wday занимает воскресенье как день 1; в то время как ОП использует понедельник.

Комментарии. Она может быть написана более сжато (только применение trial один раз), как

setDT(tstrsplit(trial, "-", type.convert=TRUE))[, 
    paste0(wdays[V2 + 1], " ", V1, ":00") 
] 

Вы можете увидеть, как это работает, имея взгляд на промежуточный результат:

data.table(trial)[,tstrsplit(trial, "-", type.convert=TRUE)] 
# V1 V2 
# 1: 9 5 
# 2: 7 5 
# 3: 13 3 
# 4: 17 6 
Смежные вопросы