Экспорт данных даты в файл .xlsx с ошибкой XLConnect (R)?

ОБНОВЛЕНИЕ 2: Пример, вызывающий проблему.

Пример файла Excel: это пустой файл .xlsx с именем листа Sheet1. Пример кода R:

library(chron)
library(rJava)
library(xlsxjars)
library(xlsx)
library(XLConnect)

setwd("C:/")

Day<-as.Date('2014-01-01')
Data<-as.data.frame(rep(Day,35))

name<-paste("Example.xls")
Master<-loadWorkbook(name, create=TRUE)
writeWorksheet(object=Master, data=Data,sheet="Sheet1", startRow=2, startCol=1,header=FALSE)
saveWorkbook(Master)

ОБНОВЛЕНИЕ: числовое значение во фрейме данных для «31.12.2013» - 16070. Последняя дата - «25.03.2014» со значением 16154.

Это ожидаемо. Однако, когда я смотрю на числа, написанные на листе, «31.12.2013» равно 41638,75 и должно быть 41639. «25.03.2014» равно 41722,79 и должно быть 41723.

Мне что-то не хватает в том, как фрейм данных R интерпретирует целую дату? Вычитает ли процедура Java определенную долю целого числа?

ОРИГИНАЛ: я пытаюсь экспортировать множество фреймов данных на разные листы файла .xlsx. Мой фрейм данных содержит информацию только о дате во фрейме данных. (например, "2013-12-31")

Я использую следующий код, чтобы экспортировать его в свой файл Excel.

Temp<-data
name<-paste("Master.xlsx") 
Master<-loadWorkbook(name, create=TRUE)
writeWorksheet(object=Master,data=Temp,sheet="Ft. Wayne",startRow = 2, startCol = 1,   header=FALSE)
saveWorkbook(Master)

Когда я открываю файл .xlsx, дата отображается как:

30.12.2013 18:00:00

Как мне выполнить экспорт в формате

«31.12.2013»

И поддерживать форматирование номера ячейки "дата" в файле .xlsx?

К вашему сведению: если я изменю формат в фрейме данных, он экспортируется как «общее» значение.


person user3470133    schedule 27.03.2014    source источник
comment
Это stackoverflow.com/questions/19865890/ справка?   -  person hrbrmstr    schedule 28.03.2014
comment
Я обновил свой вопрос. Это решение не решило возникшую у меня проблему с вычитанием времени.   -  person user3470133    schedule 28.03.2014
comment
Не могли бы вы опубликовать полный воспроизводимый пример, включая данные? Кроме того, не могли бы вы предоставить вывод sessionInfo () в R, версию Java, которую вы используете, и часовой пояс, в котором вы находитесь?   -  person Martin Studer    schedule 28.03.2014
comment
sessionInfo () R версия 3.0.3 (2014-03-06) Платформа: i386-w64-mingw32 / i386 (32-разрядная версия), локаль: [1] LC_COLLATE = English_United States.1252 [2] LC_CTYPE = English_United States.1252 [ 3] LC_MONETARY = English_United States.1252 [4] LC_NUMERIC = C [5] LC_TIME = English_United States.1252 прикрепленные базовые пакеты: [1] stats graphics grDevices использует методы наборов данных на основе других прикрепленных пакетов: [1] XLConnect_0.2-7 xlsx_0 .5.5 xlsxjars_0.6.0 rJava_0.9-6 [5] chron_2.3-45 RODBC_1.3-10 загружен через пространство имен (и не прикреплен): [1] tools_3.0.3   -  person user3470133    schedule 29.03.2014
comment
версия java: 1.6.0_11 и часовой пояс: US CST   -  person user3470133    schedule 29.03.2014
comment
Я обновил исходный пост примером, демонстрирующим такое же поведение.   -  person user3470133    schedule 29.03.2014
comment
@MartinStuder, если вы еще этого не сделали, см. Выше, я понимаю, что не помечал свои ответы.   -  person user3470133    schedule 29.03.2014
comment
@hrbrmstr см. выше.   -  person user3470133    schedule 29.03.2014


Ответы (2)


Причина такого поведения в том, что объекты класса Date внутренне преобразуются в POSIXct и предполагается, что они представляют дату в полночь по всемирному координированному времени. US CST - это UTC - 6 часов, поэтому у вас есть смещение. Я бы посоветовал вам использовать POSIXct напрямую. Если вы хотите отображать даты без компонентов времени в Excel, вы можете использовать стили ячеек и форматы данных.

Пример:

library(XLConnect)

data = data.frame(Day = rep(as.POSIXct('2014-01-01'), 35))

wb = loadWorkbook("example.xls", create = TRUE)

setStyleAction(wb, XLC$"STYLE_ACTION.DATATYPE")
cs = createCellStyle(wb, name = "myDateStyle")
setDataFormat(cs, format = "yyyy-mm-dd")
setCellStyleForType(wb, style = cs, type = XLC$"DATA_TYPE.DATETIME")

createSheet(wb, name = "test")
writeWorksheet(wb, data = data, sheet = "test", startRow = 2, startCol = 1, header = FALSE)

saveWorkbook(wb)
person Martin Studer    schedule 30.03.2014

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

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

Вместо того, чтобы получать это в Excel: 30.12.2013 18:00:00

Получаю: «31.12.2013»

person user3720887    schedule 28.05.2015