Как импортировать значения пользовательского формата времени из Excel в R?

У меня есть R-скрипт, который зацикливается и считывает несколько электронных таблиц Excel в R с помощью пакета XLConnect. Отдельные электронные таблицы объединяются в один большой фрейм данных, а затем записываются в файл .csv для дальнейшего использования в Excel.

newDf <- readWorksheetFromFile(filename,sheet=newid,header=TRUE,
                            startRow=1,endRow=17,startCol=1,endCol=6) 

Файлы Excel содержат один столбец значений времени в пользовательском формате: ЧЧ:ММ:СС.000.

i.e. 00:18:06.264

Когда я открываю полученный CSV-файл, значения этого столбца выглядят, например, как

1899-12-31 00:06:18

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

Спасибо.


person GaryM    schedule 22.07.2015    source источник
comment
Какой результирующий CSV-файл? Это должно было создать объект данных R, а не файл csv.   -  person IRTFM    schedule 22.07.2015
comment
После того, как все листы Excel прочитаны и объединены в один большой фрейм данных (с помощью rbind), я использую write.csv, чтобы снова сделать результат видимым в Excel. Время без десятичных знаков — это то, что я вижу, когда открываю это.   -  person GaryM    schedule 22.07.2015


Ответы (2)


Использовать формат.POSIXt

 write.csv( format( as.POSIXct("1899-12-31 00:06:18.123"), "%H:%M:%OS3"), file="")
"","x"
"1","00:06:19.123"
person IRTFM    schedule 22.07.2015

Начиная с версии 0.2-10 XLConnect фактически считывает миллисекундную часть даты/времени в Excel. По умолчанию они просто не отображаются в R. Вы можете использовать options(digits.secs = 6) для их отображения в консоли R.

Что касается 1899-12-31: дата/время в Excel на самом деле являются просто числами, которые представляют количество дней с 1900-01-00 (да, день 00! - см. http://www.cpearson.com/excel/datetime.htm). Дробные дни представляют часы, минуты, секунды и миллисекунды. Таким образом, время без дат просто представлено дробными числами 0.x, которые переводятся в 1899-12-31 %HH:%MM:%SS.nnn, поскольку 01-01-1900 на самом деле не существует. Если вы хотите видеть базовые (дробные) числа при чтении дат, вы можете вручную указать тип столбца numeric и использовать forceConversion = TRUE в вызове readWorksheet, например. readWorksheet(..., colTypes = c(..., "numeric", ...), forceConversion = TRUE)

Что касается экспорта CSV: когда я использую write.csv2, кажется, что столбец POSIXct (результат вызова readWorksheet) экспортируется, включая миллисекунды.

person Martin Studer    schedule 28.07.2015