Подтвердить что ты не робот

Преобразование серийного номера excel DateTime в R DateTime

Когда таблицы excel импортируются как точки xy в ArcGIS, я продолжаю терять правильную метку DateTime для каждой точки. Таким образом, я отформатировал серийный номер DateTime, создал .shp и прочитал .shp в R, используя readOGR().

Однажды в R я могу преобразовать в правильную дату с помощью аргументов as.Date() и origin = "1899-12-30", но время не указано. Хотя я видел примеры с единственной датой, я не видел обработанных примеров с DateTime. Я использовал as.Date(), а также as.POSIXct(), но эта, казалось бы, простая задача была немного разочаровывающей, поэтому post...

Я создал образец данных с 10 строками правильного формата DateTime, а также серийный номер excel.

* Спасибо Ричарду и thelatemail за их острый взгляд на раннее препятствие. Я скорректировал данные и повторно разместил здесь.

Вот мои данные образца

helpData <- structure(list(ID = 1:10, DateTime = structure(c(9L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 8L), .Label = c("3/11/2011 7:55", "3/13/2011 7:55", 
"3/14/2011 0:00", "3/14/2011 10:04", "3/14/2011 7:55", "3/15/2011 19:55", 
"3/17/2011 7:55", "3/18/2011 4:04", "3/4/2011 6:00"), class = "factor"), 
ExcelNum = c(40606.25, 40613.32986, 40615.32986, 40616, 40616.41944, 
40616.32986, 40617.82986, 40619.32986, 40620.16944, 40620.16944
)), .Names = c("ID", "DateTime", "ExcelNum"), class = "data.frame", row.names = c(NA, 
-10L))

head(helpData)

DateTime - GMT. Время составляет 24 часа (т.е. Не AM/PM). Я работаю над Windows 7, имею самые последние R и ArcGIS 10.

Приведенный ниже код получает правильную дату, но время все еще отсутствует.

newDateTime <- as.Date(helpData[ , "ExcelNum"], origin = "1899-12-30")
head(newDateTime)

Спасибо заранее!

4b9b3361

Ответ 1

Ваш номер подсчитывает дни. Конвертируйте в секундах, и вы все настроены (меньше ошибка округления)

helpData[["ExcelDate"]] <- 
  as.POSIXct(helpData[["ExcelNum"]] * (60*60*24)
    , origin="1899-12-30"
    , tz="GMT")


#     ID        DateTime ExcelNum           ExcelDate
#  1   1   3/4/2011 6:00 40606.25 2011-03-04 06:00:00
#  2   2  3/11/2011 7:55 40613.33 2011-03-11 07:54:59
#  3   3  3/13/2011 7:55 40615.33 2011-03-13 07:54:59
#  4   4  3/14/2011 0:00 40616.00 2011-03-14 00:00:00
#  5   5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59
#  6   6  3/14/2011 7:55 40616.33 2011-03-14 07:54:59
#  7   7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59
#  8   8  3/17/2011 7:55 40619.33 2011-03-17 07:54:59
#  9   9  3/18/2011 4:04 40620.17 2011-03-18 04:03:59
#  10 10  3/18/2011 4:04 40620.17 2011-03-18 04:03:59

Ответ 2

Данные времени все еще там, они просто не отображаются - см.:

as.numeric(newDateTime)
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc

Если вы хотите работать с несколькими днями, вы, вероятно, лучше всего используете представления POSIXct. Для этого вы можете преобразовать в Date, а затем преобразовать в POSIXct, хотя это вызывает проблемы с часовым поясом, если вы хотите сделать прямое сравнение с столбцом DateTime.

helpData$newDate <- as.POSIXct(as.Date(helpData$ExcelNum,origin="1899-12-30"))
attr(helpData$newDate,"tzone") <- "UTC"
helpData

#   ID        DateTime ExcelNum             newDate
#1   1   3/4/2011 6:00 40606.25 2011-03-04 06:00:00
#2   2  3/11/2011 7:55 40613.33 2011-03-11 07:54:59
#3   3  3/13/2011 7:55 40615.33 2011-03-13 07:54:59
#4   4  3/14/2011 0:00 40616.00 2011-03-14 00:00:00
#5   5 3/14/2011 10:04 40616.42 2011-03-14 10:03:59
#6   6  3/14/2011 7:55 40616.33 2011-03-14 07:54:59
#7   7 3/15/2011 19:55 40617.83 2011-03-15 19:54:59
#8   8  3/17/2011 7:55 40619.33 2011-03-17 07:54:59
#9   9  3/18/2011 4:04 40620.17 2011-03-18 04:03:59
#10 10  3/18/2011 4:04 40620.17 2011-03-18 04:03:59

Ответ 3

Используйте функцию convertToDateTime. Это прямо вперед. Вот пример:

library(openxlsx)
convertToDateTime(helpData$ExcelNum, origin = "1900-01-01")

Дайте мне знать, как это работает.

Ответ 4

Вот еще один способ сделать это с помощью пакетов janitor и tibble:

install.packages("janitor")

install.packages("tibble")

library(tibble)

library(janitor)

excel_numeric_to_date(as.numeric(as.character(helpData$ExcelNum), date_system = "modern")

Ответ 5

Еще один вариант:

library("datetimeutils")
convert_date(helpData$ExcelNum, type = "Excel")
## [1] "2011-03-04" "2011-03-11" "2011-03-13" "2011-03-14" "2011-03-14"
## [6] "2011-03-14" "2011-03-15" "2011-03-17" "2011-03-18" "2011-03-18"

convert_date(helpData$ExcelNum, type = "Excel", fraction = TRUE)
## [1] "2011-03-04 06:00:00 CET" "2011-03-11 07:54:59 CET"
## [3] "2011-03-13 07:54:59 CET" "2011-03-14 00:00:00 CET"
## [5] "2011-03-14 10:03:59 CET" "2011-03-14 07:54:59 CET"
## [7] "2011-03-15 19:54:59 CET" "2011-03-17 07:54:59 CET"
## [9] "2011-03-18 04:03:59 CET" "2011-03-18 04:03:59 CET"