Продолжительность времени с отсутствием форматирования из Excel, ведущий себя странно в R - PullRequest
0 голосов
/ 30 августа 2018

У меня есть данные в таблице Excel, я импортирую их, используя XLConnect.

Один столбец содержит данные о продолжительности, которые были записаны следующим образом: m: ss R отображает это как странную дату.

Вот пример моих данных:

2:21
6:08
0:39
13:51

Вот как R интерпретирует это:

"1899-12-31 02:21:00"
"1899-12-31 06:08:00"
"1899-12-31 00:39:00"
"1899-12-31 13:51:00"

Любая идея, как я могу получить это интерпретировать это как длительность м: сс?

РЕДАКТИРОВАТЬ: Я хочу сравнить, наметить, и отформатировать некоторые математики в эти времена. Любая идея

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я не совсем уверен, что происходит, но R интерпретировал даты как строки. Когда я попытался преобразовать их в даты, я получил ошибку:

> typeof(as.POSIXct(td$Time.on.Task))
Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

Я понял, что у меня есть строки символов, поэтому я использовал некоторые приемы, выделенные @t_s в его ответе (большое спасибо!).

Первый шаг состоял в том, чтобы отделить бит времени от остальной части строки, подобной дате.

times <- substr(td$Time.on.Task, 12,16)
[1] "02:21" "06:08" "00:39" "13:51"

Затем я превратил их в десятичные числа, основанные на минутах, используя функцию apply и некоторую простую математику.

td$Minutes <- sapply(strsplit(times,":"),
                function(x) {
                  x <- as.numeric(x)
                  x[1]+x[2]/60
                })
[1] 2.35  6.13  0.65 13.85

И у меня есть то, что мне нужно, чтобы продолжать работать.

0 голосов
/ 30 августа 2018

А как же:
Если вы хотите манипулировать ими как временем, вы можете попробовать это:

u <- c('2:21','6:08','0:39','13:51')
strptime(u,'%M:%S')
[1] "2018-08-30 00:02:21 CEST" "2018-08-30 00:06:08 CEST" "2018-08-30 00:00:39 CEST" "2018-08-30 00:13:51 CEST"

Таким образом, вы можете выполнять такие операции, как алгебраические суммы:

strptime(u,'%M:%S')-strptime(u[2],'%M:%S')
Time differences in secs
[1] -227    0 -329  463

Если вам нужен просто символьный вектор, вы можете немного его обрезать:

substr(strptime(u,'%M:%S'),15,19)
[1] "02:21" "06:08" "00:39" "13:51"

или

format(strptime(u,'%M:%S'), '%M:%S')
[1] "02:21" "06:08" "00:39" "13:51"

Наконец, если вы хотите, чтобы десятичные числа минут использовались только в том случае, если они существуют, вы можете попробовать это:

ifelse(
substr(strptime(u,'%M:%S'),15,15)==0,
    substr(strptime(u,'%M:%S'),16,19),
    substr(strptime(u,'%M:%S'),15,19))
 [1] "2:21"  "6:08"  "0:39"  "13:51"

EDIT

Если вы хотите использовать 60 шкал как раз, то один вариант подходит для графиков:

 u <- c('2:21','6:08','0:39','13:51')
    strptime(u,'%M:%S')
    [1] "2018-08-30 00:02:21 CEST" "2018-08-30 00:06:08 CEST" "2018-08-30 00:00:39 CEST" "2018-08-30 00:13:51 CEST"
plot(x=c(1,2,3,4),strptime(u,'%M:%S'))

Если вы предпочитаете десятичную шкалу, вы можете преобразовать ее:

sapply(strsplit(u,":"),
  function(x) {
    x <- as.numeric(x)
    x[1]+x[2]/60
    })

[1]  2.350000  6.133333  0.650000 13.850000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...