Converting excel DateTime serial number to R DateTime
Use the function convertToDateTime
. It's straight forward. Here's an example:
library(openxlsx)
convertToDateTime(helpData$ExcelNum, origin = "1900-01-01")
Let me know how it works.
The time data is still there, it's just not displayed - see:
as.numeric(newDateTime)
#[1] 15037.25 15044.33 15046.33 15047.00 etc etc
If you are wishing to work with parts of days, you are probably best using POSIXct
representations though. To do so, you can convert to Date
, then convert to POSIXct
, though this does bring into play timezone issues if you want to do a direct comparison to your DateTime
column.
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
Your number is counting days. Convert to seconds, and you're all set (less a rounding error)
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