Openxlsx convertToDateTime пропускает время с большим набором данных

Я пытаюсь использовать openxlsx для чтения больших файлов Excel с данными временных рядов. Я обнаружил, что convertToDateTime начинает пропускать время, если числовой аргумент вектора превышает определенное количество элементов. Мой код выглядит так:

ts <- readWorkbook(my.wb, sheet = as.character(r[["dSheet"]]), 
                startRow = 2, cols = 1, 
                colNames=FALSE, detectDates=FALSE)
colnames(ts) <- c("dt")
> head(convertToDateTime(ts$dt[1:30830]))
[1] "2016-11-23 15:20:00 MST" "2016-11-23 15:24:59 MST"
[3] "2016-11-23 15:30:00 MST" "2016-11-23 15:34:59 MST"
[5] "2016-11-23 15:40:00 MST" "2016-11-23 15:45:00 MST"

> head(convertToDateTime(ts$dt[1:30840]))
[1] "2016-11-23 MST" "2016-11-23 MST" "2016-11-23 MST" "2016-11-23 MST"
[5] "2016-11-23 MST" "2016-11-23 MST"

Дополнительный вопрос: если вы посмотрите на элемент № 2 (2016-11-23 15:24:59) в моем исходном коде, это на самом деле должно быть 15:25. Если есть простой способ исправить это, пожалуйста, дайте мне знать...

Вот рабочий пример:

>library("openxlsx")
>dates <- runif(31000, 41000, 42000)
>head(convertToDateTime(dates[1:5000]))

[1] "2013-05-29 09:34:28 MDT" "2014-07-01 03:52:13 MDT"
[3] "2012-06-02 09:27:47 MDT" "2012-05-06 13:42:04 MDT"
[5] "2014-09-26 04:50:36 MDT" "2013-10-26 03:14:00 MDT"

> head(convertToDateTime(dates[1:10000]))
[1] "2013-05-29 MDT" "2014-07-01 MDT" "2012-06-02 MDT" "2012-05-06 MDT"
[5] "2014-09-26 MDT" "2013-10-26 MDT"

Есть ли исправление для такого поведения, или вы бы порекомендовали попробовать совершенно другой подход (реализовать преобразование)?

Заранее спасибо за вашу помощь!

2 ответа

Я нашел обходной путь к моей проблеме в Преобразовании числового времени в формат POSIXct даты и времени в R. Просто умножьте часы Excels на 3600 *24, чтобы получить промежуток времени в секундах, и используйте as.POSIXCT отлично работает:

> dates <- runif(30000, 41000, 42000)
> ts1 <- convertToDateTime(dates)
> ts2 <- as.POSIXct(dates*3600*24, tz="GMT", origin = "1900-01-01")
> head(ts1)
[1] "2013-10-04 MDT" "2012-04-04 MDT" "2014-06-12 MDT" "2013-01-24 MST"
[5] "2012-09-12 MDT" "2014-11-11 MST"
> head(ts2)
[1] "2013-10-06 02:43:24 GMT" "2012-04-06 11:59:54 GMT"
[3] "2014-06-14 16:43:06 GMT" "2013-01-26 00:25:17 GMT"
[5] "2012-09-14 07:26:47 GMT" "2014-11-13 18:52:03 GMT"

Поскольку это так здорово работает, я не понимаю преимуществ рабочего процесса openxlsx convertToDateTime. Использование as.POSIXct в сочетании с openxlsx' getDateOrigin() также решает проблему округления, которую я описал в своем первоначальном вопросе.

Я предлагаю сохранить файл Excel какcsvфайл и с помощьюparse_date_time()функция для унификации форматов даты.

Другие вопросы по тегам